Устанавливаем необходимые библиотки

library(tidyverse)
library(DESeq2)
library(pheatmap)
library(RColorBrewer)
library(clusterProfiler)
library(biomaRt)
library(org.Hs.eg.db)
library(EnhancedVolcano)
library(GenomicRanges)
library(msigdbr)
library(multiMiR)
library(miRBaseConverter)
library(enrichplot)
library(vsn)
library(rvest)
library(patchwork)
library(dbplyr)

Импортируем данные

coldata <- read_tsv("data/phenotable.tsv", show_col_types = FALSE)
rownames(coldata) <- coldata$sample
Warning: Setting row names on a tibble is deprecated.
coldata
counts <- read.csv("data/miR.Counts.csv", header = TRUE, sep = ",")
counts <- column_to_rownames(counts, var = "miRNA")
head(counts)
colnames(counts) <- gsub("^X", "", colnames(counts))

counts_samples <- colnames(counts)
phenotable_samples <- coldata$sample
common_samples <- intersect(counts_samples, phenotable_samples)

counts <- counts[, c(counts$miRNA, common_samples)]  
counts <- counts[, rownames(coldata)] #ранжирую по колонки в counts так же как и названия строк в coldata
head(counts)
anno <- read.csv("data/annotation.report.csv", header = TRUE, sep = ",")
anno$Sample.name.s. <- gsub("-", ".", anno$Sample.name.s.)
anno <- anno[, -c(2:5, 7, 15)]


common_samples <- intersect(anno$Sample.name.s., coldata$sample)

anno <- anno[anno$Sample.name.s. %in% common_samples, ]
anno <- anno[match(rownames(coldata), anno$Sample.name.s.), ] #ранжирую по колонки в counts так же как и названия строк в coldata
anno

Весь датасет

anno_long <- anno %>%
  pivot_longer(cols = -Sample.name.s., names_to = "RNA_Type", values_to = "Count")

plt <- ggplot(anno_long, aes(x = Sample.name.s., y = Count, fill = RNA_Type)) +
  geom_bar(stat = "identity") +
  theme_minimal() +
  labs(x = "Sample", y = "Read Count") +
  theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
  scale_fill_brewer(palette = "Set3")  # Красивые цвета

print(plt)
ggsave("./pictures_transpl/transpl_barplot_alldataset_no_normalised.tiff", plot = plt, width = 8, height = 6, dpi = 300,  bg = "white")

anno_long <- anno %>%
  rowwise() %>%
  mutate(across(-Sample.name.s., ~ . / sum(c_across(-Sample.name.s.)))) %>% 
  ungroup() %>%
  pivot_longer(cols = -Sample.name.s., names_to = "RNA_Type", values_to = "Proportion")

plt <- ggplot(anno_long, aes(x = Sample.name.s., y = Proportion, fill = RNA_Type)) +
  geom_bar(stat = "identity") +
  theme_minimal() +
  labs(x = "Sample", y = "Proportion") +
  theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
  scale_fill_brewer(palette = "Set3")

plt
ggsave("./pictures_transpl/transpl_barplot_alldataset_normalised.tiff", plot = plt, width = 8, height = 6, dpi = 300, bg = "white")

coldata$condition <- relevel(factor(coldata$condition), ref = "no_complications")
modelMatrix <- model.matrix(~condition, coldata)
modelMatrix
   (Intercept) conditioncellular conditionhumoral conditionTCAD
1            1                 0                0             0
2            1                 0                0             0
3            1                 0                1             0
4            1                 1                0             0
5            1                 0                0             1
6            1                 0                0             1
7            1                 0                0             1
8            1                 0                0             0
9            1                 0                0             0
10           1                 0                0             0
11           1                 0                0             0
12           1                 0                1             0
13           1                 0                1             0
14           1                 1                0             0
15           1                 1                0             0
16           1                 1                0             0
17           1                 1                0             0
18           1                 1                0             0
19           1                 0                0             1
20           1                 0                0             1
21           1                 0                1             0
22           1                 0                0             1
23           1                 0                0             1
24           1                 0                1             0
25           1                 0                1             0
26           1                 0                0             0
27           1                 0                0             0
28           1                 0                1             0
29           1                 0                0             0
attr(,"assign")
[1] 0 1 1 1
attr(,"contrasts")
attr(,"contrasts")$condition
[1] "contr.treatment"
qr(modelMatrix)$rank  # ранг матрицы
[1] 4
ncol(modelMatrix) 
[1] 4
dds <- DESeqDataSetFromMatrix(countData = counts, colData = coldata, design = ~ condition)
converting counts to integer mode
dds$condition <- relevel(dds$condition, ref = "no_complications")
dds
class: DESeqDataSet 
dim: 913 29 
metadata(1): version
assays(1): counts
rownames(913): Hsa-Let-7-P1a_3p* Hsa-Let-7-P1a_5p/P2a1_5p/P2a2_5p ... Hsa-Mir-9851_3p Hsa-Mir-9851_5p*
rowData names(0):
colnames(29): 105_S1_R1_001 197_S2_R1_001 ... 127_S29_R1_001 138_S30_R1_001
colData names(2): sample condition
dim(dds)
[1] 913  29
smallestGroupSize <- 15
keep <- rowSums(counts(dds) >= 10) >= smallestGroupSize
dds <- dds[keep,]
dim(dds)
[1] 297  29

Run Differential Expression Analysis

dds <- DESeq(dds, fitType = "parametric")
estimating size factors
estimating dispersions
gene-wise dispersion estimates
mean-dispersion relationship
final dispersion estimates
fitting model and testing
-- replacing outliers and refitting for 31 genes
-- DESeq argument 'minReplicatesForReplace' = 7 
-- original counts are preserved in counts(dds)
estimating dispersions
fitting model and testing
dds
class: DESeqDataSet 
dim: 297 29 
metadata(1): version
assays(6): counts mu ... replaceCounts replaceCooks
rownames(297): Hsa-Let-7-P1a_5p/P2a1_5p/P2a2_5p Hsa-Let-7-P1b_5p ... Hsa-Mir-96-P3_3p* Hsa-Mir-96-P3_5p
rowData names(31): baseMean baseVar ... maxCooks replace
colnames(29): 105_S1_R1_001 197_S2_R1_001 ... 127_S29_R1_001 138_S30_R1_001
colData names(4): sample condition sizeFactor replaceable
plotDispEsts(dds)

raw_counts <- counts(dds, normalized = FALSE)
normalized_counts <- counts(dds, normalized = TRUE)

df <- data.frame(
  Sample = rep(colnames(dds), 2),
  Counts = c(colSums(raw_counts), colSums(normalized_counts)),
  Type = rep(c("Raw", "Normalized"), each = ncol(dds))
)

plt <- ggplot(df, aes(x = Sample, y = Counts, fill = Type)) +
  geom_bar(stat = "identity", position = "dodge") +
  theme_minimal() +
  labs(title = "Counts before and after normalization", x = "Sample", y = "Total Counts") +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

plt
ggsave("./pictures_transpl/transpl_Counts before and after normalization.tiff", plot = plt, width = 8, height = 6, dpi = 300, bg = "white")

rlog трансформация

rlt <- rlog(dds)  #rlog Transformation
meanSdPlot(assay(rlt)) 

vsd <- varianceStabilizingTransformation(dds, blind=FALSE) 
meanSdPlot(assay(vsd)) #показывает, как изменяется стандартное отклонение в зависимости от среднего значения экспрессии

** PCA plot **

pcaData <- plotPCA(rlt, intgroup=c("condition"), returnData = TRUE)
using ntop=500 top features by variance
percentVar <- round(100 * attr(pcaData, "percentVar"))

pcaData$sample <- gsub("_.*", "", coldata$sample)


plt <- ggplot(pcaData, aes(PC1, PC2, color = condition)) +
  geom_text(aes(label=sample), size=3, vjust=1.5) +
  geom_point(size = 3) +
  xlab(paste0("PC1: ", percentVar[1], "%")) +
  ylab(paste0("PC2: ", percentVar[2], "%")) + 
  coord_fixed() +
  theme_bw() +
  scale_color_brewer(palette = "Set2")
plt
ggsave("./pictures_transpl/transpl_PCA plot.tiff", plot = plt, width = 8, height = 6, dpi = 300, bg = "white")

Plot a heatmap of 50 most expressed genes Этот heatmap отражает уровни экспрессии генов, а не разницу между группами. Цвета не означают up- или down-регуляцию в сравнении с контрольной группой, потому что heatmap показывает абсолютные значения экспрессии, а не fold change!

select <- order(rowMeans(counts(dds,normalized=TRUE)),
                decreasing=TRUE)[1:50]
df <- as.data.frame(colData(dds)$condition)
colnames(df) <- "condition"
rownames(df) <- colnames(counts(dds))
plt <- pheatmap(assay(rlt)[select,], 
         cluster_rows = TRUE, 
         show_rownames = TRUE, 
         cluster_cols = TRUE, 
         annotation_col = df,
         fontsize_row = 6) 

plt

ggsave("./pictures_transpl/transpl_Plot a heatmap of 50 most expressed genes.tiff", plot = plt, width = 8, height = 6, dpi = 300, bg = "white")

Plot of the distance between samples heatmap Расчет расстояний между образцами • Обычно используется евклидово расстояние (по умолчанию в DESeq2). • Оно вычисляется по нормализованным данным экспрессии (rlog() или vst()). • Чем меньше расстояние — тем более похожи образцы.

sampleDists <- dist(t(assay(rlt)))
sampleDistMatrix <- as.matrix(sampleDists)
rownames(sampleDistMatrix) <- paste(rlt$condition)
colnames(sampleDistMatrix) <- paste(rlt$condition)
colors <- colorRampPalette(rev(brewer.pal(9, "Blues")) )(255)

plt <- pheatmap(sampleDistMatrix,
         clustering_distance_rows = "euclidean",
         clustering_distance_cols = "euclidean",
         color = colors)

plt

ggsave("./pictures_transpl/transpl_Plot of the distance between samples heatmap.tiff", plot = plt, width = 8, height = 6, dpi = 300, bg = "white")
res_humoral <- results(dds, contrast=c("condition", "no_complications", "humoral"))
res_humoral
log2 fold change (MLE): condition no_complications vs humoral 
Wald test p-value: condition no_complications vs humoral 
DataFrame with 297 rows and 6 columns
                                    baseMean log2FoldChange     lfcSE      stat    pvalue      padj
                                   <numeric>      <numeric> <numeric> <numeric> <numeric> <numeric>
Hsa-Let-7-P1a_5p/P2a1_5p/P2a2_5p   72441.408      0.0618842  0.288818  0.214267 0.8303389  0.939409
Hsa-Let-7-P1b_5p                    2471.713     -0.9029022  0.495172 -1.823412 0.0682410  0.396094
Hsa-Let-7-P1c_5p                    1586.095     -1.0840729  0.471749 -2.297986 0.0215626  0.246039
Hsa-Let-7-P2a1_3p*                   106.535      0.0898204  0.728328  0.123324 0.9018504  0.974875
Hsa-Let-7-P2a2_3p*                   117.677     -2.1053617  1.182746 -1.780062 0.0750658  0.409032
...                                      ...            ...       ...       ...       ...       ...
Hsa-Mir-95-P3_5p                     11.6942       1.248042  1.169651  1.067020 0.2859626        NA
Hsa-Mir-96-P1_5p                    452.3189       1.016073  0.712354  1.426361 0.1537643 0.6037509
Hsa-Mir-96-P2_5p                 104065.5500      -0.309282  0.550995 -0.561315 0.5745829 0.8960804
Hsa-Mir-96-P3_3p*                    27.6400       0.953532  0.804588  1.185117 0.2359712 0.7233923
Hsa-Mir-96-P3_5p                   1433.3806       1.044344  0.364247  2.867132 0.0041421 0.0737293

MA plot Фильтрация точек с низким средним экспрессированием (по baseMean). • Обычно отсекаются baseMean < 1. 2. Определение значимых генов (синие точки): • Используется критерий padj < 0.1 по умолчанию, а не < 0.05!

tiff("./pictures_transpl/transpl_PlotMA_standart_padj_0.05_humoral.tiff", 
     width = 8, height = 6, units = "in", res = 300, bg = "white")
plotMA(res_humoral, alpha = 0.05, ylim = c(-8, 8)) 
dev.off()
null device 
          1 
plotMA(res_humoral, alpha = 0.05, ylim = c(-8, 8)) 

Кастомный MA plot

res_df <- res_humoral %>%
  as.data.frame() %>%
  mutate(color = case_when( 
    padj < 0.05  ~ "padj < 0.05",   
    pvalue < 0.05  ~ "pvalue < 0.05", 
    TRUE ~ "All"
  ))

plt <- ggplot(res_df, aes(x = baseMean, y = log2FoldChange, color = color)) +
  geom_point(alpha = 0.7, size = 1) +
  geom_hline(yintercept = 0, linetype = "solid", color = "gray40", size = 1.5) +
  scale_color_manual(values = c("All" = "gray70", 
                                "pvalue < 0.05" = "blue", 
                                "padj < 0.05" = "red")) +
  scale_x_log10(labels = scales::scientific) + 
  theme_minimal() +
  labs(x = "mean of normalized counts", 
       y = "log fold change", 
       color = NULL)

plt
ggsave("./pictures_transpl/transpl_Сustom MAplot_humoral.tiff", plot = plt, width = 8, height = 6, dpi = 300, bg = "white")

Значимые результаты

58 генов (20%) имеют низкие уровни экспрессии и фильтруются из анализа. independent filtering — процедура, которая исключает гены с низкими значениями для увеличения статистической мощности.

signres_humoral <- results(dds, contrast=c("condition", "no_complications", "humoral"), alpha=0.05) 
summary(signres_humoral)

out of 297 with nonzero total read count
adjusted p-value < 0.05
LFC > 0 (up)       : 0, 0%
LFC < 0 (down)     : 9, 3%
outliers [1]       : 1, 0.34%
low counts [2]     : 58, 20%
(mean count < 40)
[1] see 'cooksCutoff' argument of ?results
[2] see 'independentFiltering' argument of ?results

Let’s arranged it by log2FoldChange:

order_indices <- order(-res_humoral$log2FoldChange)
res_humoral[order_indices, ]
log2 fold change (MLE): condition no_complications vs humoral 
Wald test p-value: condition no_complications vs humoral 
DataFrame with 297 rows and 6 columns
                     baseMean log2FoldChange     lfcSE      stat      pvalue       padj
                    <numeric>      <numeric> <numeric> <numeric>   <numeric>  <numeric>
Hsa-Mir-542_3p       179.1170        1.55776  0.661653   2.35434   0.0185557   0.225199
Hsa-Mir-190-P1_5p     19.6983        1.54017  1.120054   1.37509   0.1691041         NA
Hsa-Mir-874_3p       183.9741        1.53509  0.798423   1.92265   0.0545243   0.378167
Hsa-Mir-624_5p        18.9670        1.36865  1.076852   1.27097   0.2037388         NA
Hsa-Mir-95-P3_5p      11.6942        1.24804  1.169651   1.06702   0.2859626         NA
...                       ...            ...       ...       ...         ...        ...
Hsa-Mir-873_3p       102.3872       -2.74537  1.229274  -2.23333 2.55274e-02 0.27263230
Hsa-Mir-10-P2a_5p   1162.4941       -2.85595  0.650038  -4.39350 1.11539e-05 0.00148904
Hsa-Mir-483_5p       144.9177       -3.86731  1.288810  -3.00068 2.69377e-03 0.06522233
Hsa-Mir-193-P1b_5p*  152.0458       -4.84885  0.982406  -4.93569 7.98689e-07 0.00021325
Hsa-Mir-193-P1b_3p    99.8971       -5.64893  1.644846  -3.43432 5.94044e-04 0.02643497

Visualisation for the first gene

#plotCounts(dds, gene=which.max(res_humoral$log2FoldChange), intgroup="condition")
plotCounts(dds, gene=which.min(res_humoral$padj), intgroup="condition")

#plotCounts(dds, gene=rownames(res)[which.min(res$padj[which.max(res$log2FoldChange)])], intgroup="condition")

Volcano plot

plt <- EnhancedVolcano(res_humoral,
                lab = rownames(res_humoral),
                x = "log2FoldChange",
                y = "padj",
                pCutoff = 0.05,
                FCcutoff = 1,
                labSize = 3.0,
                boxedLabels = FALSE,
                col = c('black', '#CBD5E8', '#B3E2CD', '#FDCDAC'),
                colAlpha = 1,
                title = NULL,        
                subtitle = NULL) 

plt
ggsave("./pictures_transpl/transpl_VolcanoPlot_humoral.tiff", plot = plt, width = 8, height = 6, dpi = 300, bg = "white")

coldata_filtered <- coldata[coldata$condition %in% c("humoral", "no_complications"), ]
coldata_filtered

Plot a heatmap of diff expressed genes

res_sign_humoral <- subset(res_humoral, padj < 0.05 & !is.na(padj) & abs(log2FoldChange) > 1.0)
res_sign_humoral <- res_sign_humoral[order(res_sign_humoral$log2FoldChange, decreasing = TRUE), ]

sig_genes <- rownames(res_sign_humoral)  

de_mat <- assay(rlt)[sig_genes, ] 

de_mat_filtered <- de_mat[, coldata_filtered$sample]
#datamatrix <- t(scale(t(de_mat_filtered)))
datamatrix <- de_mat_filtered

annotation_col <- data.frame(condition = coldata_filtered$condition)
rownames(annotation_col) <- colnames(datamatrix)

annotation_colors <- list(
  condition = c("no_complications" = "#FFCC00", "humoral" = "#3399FF"))

plt <- pheatmap(datamatrix,
         cluster_rows = TRUE, 
         show_rownames = TRUE, 
         cluster_cols = TRUE, 
         annotation_col = annotation_col,
         annotation_colors = annotation_colors,
         display_numbers = FALSE,
         legend = TRUE,
         fontsize = 15)  


ggsave("./pictures_transpl/transpl_Heatmap of diff expressed genes_humoral.tiff", plot = plt, width = 8, height = 6, dpi = 300, bg = "white")

Анализ обогащения гуморальный ответ

up_humoral <- res_sign_humoral %>% 
  as.data.frame() %>% 
  filter(log2FoldChange > 0)
down_humoral <- res_sign_humoral %>% 
  as.data.frame() %>% 
  filter(log2FoldChange < 0)
rownames(up_humoral)
character(0)
rownames(down_humoral)
[1] "Hsa-Mir-146-P1_5p"   "Hsa-Mir-425_3p*"     "Hsa-Mir-148-P2_3p"   "Hsa-Mir-10-P3c_5p"   "Hsa-Mir-10-P2a_5p"  
[6] "Hsa-Mir-193-P1b_5p*" "Hsa-Mir-193-P1b_3p" 

Переводим в miRBase • miRBase: https://www.mirbase.org/ • MirGeneDB: https://mirgenedb.org/

url <- "https://mirgenedb.org/browse/hsa"
page <- read_html(url)

Парсим таблицу

mir_table <- page %>%
  html_element("table") %>%
  html_table(fill = TRUE) 

mir_table <- mir_table[-c(1:3), c(1,2) ] 
colnames(mir_table) <- c("MirGeneDB_ID", "MiRBase_ID")
mir_table$MirGeneDB_ID <- sub(" V", "", mir_table$MirGeneDB_ID)

head(mir_table)
down_humoral_clean <- sub("_.*", "", row.names(down_humoral))
down_humoral_converted <- mir_table$MiRBase_ID[match(down_humoral_clean, mir_table$MirGeneDB_ID)]
down_humoral_converted
[1] "hsa-mir-146b"   "hsa-mir-425"    NA               "hsa-mir-125b-2" NA               "hsa-mir-193a"  
[7] "hsa-mir-193a"  

Конвертация в MIMATID NA без соответствия удалила из анализа

NA Hsa-Mir-148-P2_3p есть три похожих соответствия: Hsa-Mir-148-P1 hsa-mir-148a
Hsa-Mir-148-P3 hsa-mir-152
Hsa-Mir-148-P4 hsa-mir-148b

NA Hsa-Mir-10-P2a_5p есть три похожих соответствие: Hsa-Mir-10-P2b hsa-mir-99b
Hsa-Mir-10-P2c hsa-mir-99a
Hsa-Mir-10-P2d hsa-mir-100

[1] “Hsa-Mir-146-P1_5p” “Hsa-Mir-425_3p” ”Hsa-Mir-148-P2_3p” ”Hsa-Mir-10-P3c_5p” ”Hsa-Mir-10-P2a_5p”
[6] ”Hsa-Mir-193-P1b_5p
” “Hsa-Mir-193-P1b_3p”

mirna_names_down <- c("hsa-miR-146b-5p", "hsa-miR-425-3p", "hsa-miR-125b-5p", "hsa-miR-193a-5p", "hsa-miR-193a-3p")
converted_mirna_down <- miRNAVersionConvert(mirna_names_down)
converted_mirna_down

Запрос таргетов из базы multiMiR

targets_humoral_down <- unique(get_multimir(org = "hsa", mirna = converted_mirna_down$Accession, table = "validated")@data$target_symbol)
Searching mirecords ...
Searching mirtarbase ...
Searching tarbase ...
#writeLines(targets_down, "targets_down150_list.txt")

Анализ обогащения из базы биологических процессов

#msig_go_bp <- msigdbr(species = "Homo sapiens", category = "C5", subcategory = "GO:BP")
# targets_down <- readLines("targets_down150_list.txt")
# targets_up <- readLines("targets_up150_list.txt")

GO_enrich_down_humoral_bp <- enrichGO(
  gene          = targets_humoral_down,  
  OrgDb         = org.Hs.eg.db,
  keyType       = "SYMBOL",
  ont           = "BP", 
  pAdjustMethod = "BH",
  qvalueCutoff  = 0.05
)

Визуализация


p1 <- dotplot(GO_enrich_down_humoral_bp, showCategory = 20) + 
  ggtitle("GO Enrichment for DOWNregulated targets") + 
  theme(
    plot.title = element_text(size = 12, face = "bold"),
    axis.text.y = element_text(size = 11)
  )

p1

ggsave("./pictures_transpl/transpl_GO_enrichment_dotplot_down_humoral_bp.tiff", plot = p1, width = 16, height = 10, dpi = 300)

GO_enrich_DOWN_humoral_BP <- enrichplot::pairwise_termsim(GO_enrich_down_humoral_bp, method = "JC")

plt <- emapplot(GO_enrich_DOWN_humoral_BP, 
         repel = TRUE,
         showCategory = 20) +
  ggtitle("Biological processes for DOWNregulated targets for humoral") +
  theme(
    plot.title = element_text(size = 12, face = "bold"),
    axis.text = element_text(size = 3)
    )    

plt

ggsave("./pictures_transpl/transpl_GO_enrichment_emapplot_DOWN_humoral_BP.tiff", plot = plt, width = 16, height = 10, dpi = 300)

##Клеточное отторжение

res_cellular <- results(dds, contrast=c("condition", "no_complications", "cellular"))
res_cellular
log2 fold change (MLE): condition no_complications vs cellular 
Wald test p-value: condition no_complications vs cellular 
DataFrame with 297 rows and 6 columns
                                    baseMean log2FoldChange     lfcSE
                                   <numeric>      <numeric> <numeric>
Hsa-Let-7-P1a_5p/P2a1_5p/P2a2_5p   72441.408       0.154411  0.302046
Hsa-Let-7-P1b_5p                    2471.713      -0.210240  0.517815
Hsa-Let-7-P1c_5p                    1586.095       0.143934  0.493386
Hsa-Let-7-P2a1_3p*                   106.535      -0.261443  0.759181
Hsa-Let-7-P2a2_3p*                   117.677      -0.228063  1.237539
...                                      ...            ...       ...
Hsa-Mir-95-P3_5p                     11.6942    -0.95512860  1.183561
Hsa-Mir-96-P1_5p                    452.3189     0.23819994  0.743879
Hsa-Mir-96-P2_5p                 104065.5500     0.40633653  0.576244
Hsa-Mir-96-P3_3p*                    27.6400    -0.00541547  0.825501
Hsa-Mir-96-P3_5p                   1433.3806     0.62651744  0.380360
                                        stat    pvalue      padj
                                   <numeric> <numeric> <numeric>
Hsa-Let-7-P1a_5p/P2a1_5p/P2a2_5p    0.511217  0.609199  0.999634
Hsa-Let-7-P1b_5p                   -0.406015  0.684732  0.999634
Hsa-Let-7-P1c_5p                    0.291728  0.770495  0.999634
Hsa-Let-7-P2a1_3p*                 -0.344375  0.730564  0.999634
Hsa-Let-7-P2a2_3p*                 -0.184288  0.853788  0.999634
...                                      ...       ...       ...
Hsa-Mir-95-P3_5p                 -0.80699552 0.4196691  0.999634
Hsa-Mir-96-P1_5p                  0.32021308 0.7488068  0.999634
Hsa-Mir-96-P2_5p                  0.70514677 0.4807189  0.999634
Hsa-Mir-96-P3_3p*                -0.00656022 0.9947657  0.999634
Hsa-Mir-96-P3_5p                  1.64717130 0.0995228  0.999634

MA plot

tiff("./pictures_transpl/transpl_PlotMA_standart_padj_0.05_cellular.tiff", 
     width = 8, height = 6, units = "in", res = 300, bg = "white")
plotMA(res_cellular, alpha = 0.05, ylim = c(-8, 8)) 
dev.off()
null device 
          1 
plotMA(res_cellular, alpha = 0.05, ylim = c(-8, 8)) 

Кастомный MA plot

res_df <- res_cellular %>%
  as.data.frame() %>%
  mutate(color = case_when( 
    padj < 0.05  ~ "padj < 0.05",   
    pvalue < 0.05  ~ "pvalue < 0.05", 
    TRUE ~ "All"
  ))

plt <- ggplot(res_df, aes(x = baseMean, y = log2FoldChange, color = color)) +
  geom_point(alpha = 0.7, size = 1) +
  geom_hline(yintercept = 0, linetype = "solid", color = "gray40", size = 1.5) +
  scale_color_manual(values = c("All" = "gray70", 
                                "pvalue < 0.05" = "blue", 
                                "padj < 0.05" = "red")) +
  scale_x_log10(labels = scales::scientific) + 
  theme_minimal() +
  labs(x = "mean of normalized counts", 
       y = "log fold change", 
       color = NULL)

plt
ggsave("./pictures_transpl/transpl_Сustom MAplot_cellular.tiff", plot = plt, width = 8, height = 6, dpi = 300, bg = "white")

БКAПC

res_TCAD <- results(dds, contrast=c("condition", "no_complications", "TCAD"))
res_TCAD
log2 fold change (MLE): condition no_complications vs TCAD 
Wald test p-value: condition no_complications vs TCAD 
DataFrame with 297 rows and 6 columns
                                    baseMean log2FoldChange     lfcSE
                                   <numeric>      <numeric> <numeric>
Hsa-Let-7-P1a_5p/P2a1_5p/P2a2_5p   72441.408      0.1355361  0.288810
Hsa-Let-7-P1b_5p                    2471.713     -0.3022559  0.495113
Hsa-Let-7-P1c_5p                    1586.095      0.0210025  0.471732
Hsa-Let-7-P2a1_3p*                   106.535      0.6849887  0.727057
Hsa-Let-7-P2a2_3p*                   117.677      0.7040008  1.184495
...                                      ...            ...       ...
Hsa-Mir-95-P3_5p                     11.6942       1.118711  1.146318
Hsa-Mir-96-P1_5p                    452.3189       0.410861  0.711305
Hsa-Mir-96-P2_5p                 104065.5500       0.865642  0.550995
Hsa-Mir-96-P3_3p*                    27.6400       0.146171  0.789581
Hsa-Mir-96-P3_5p                   1433.3806       0.517593  0.363648
                                       stat    pvalue      padj
                                  <numeric> <numeric> <numeric>
Hsa-Let-7-P1a_5p/P2a1_5p/P2a2_5p  0.4692911  0.638862  0.999465
Hsa-Let-7-P1b_5p                 -0.6104787  0.541545  0.999465
Hsa-Let-7-P1c_5p                  0.0445222  0.964488  0.999465
Hsa-Let-7-P2a1_3p*                0.9421391  0.346121  0.999465
Hsa-Let-7-P2a2_3p*                0.5943468  0.552280  0.999465
...                                     ...       ...       ...
Hsa-Mir-95-P3_5p                   0.975917  0.329105  0.999465
Hsa-Mir-96-P1_5p                   0.577616  0.563523  0.999465
Hsa-Mir-96-P2_5p                   1.571051  0.116171  0.999465
Hsa-Mir-96-P3_3p*                  0.185125  0.853131  0.999465
Hsa-Mir-96-P3_5p                   1.423334  0.154639  0.999465

MA plot

tiff("./pictures_transpl/transpl_PlotMA_standart_padj_0.05_TCAD.tiff", 
     width = 8, height = 6, units = "in", res = 300, bg = "white")
plotMA(res_TCAD, alpha = 0.05, ylim = c(-8, 8)) 
dev.off()
null device 
          1 
plotMA(res_TCAD, alpha = 0.05, ylim = c(-8, 8)) 

Кастомный MA plot

res_df <- res_TCAD %>%
  as.data.frame() %>%
  mutate(color = case_when( 
    padj < 0.05  ~ "padj < 0.05",   
    pvalue < 0.05  ~ "pvalue < 0.05", 
    TRUE ~ "All"
  ))

plt <- ggplot(res_df, aes(x = baseMean, y = log2FoldChange, color = color)) +
  geom_point(alpha = 0.7, size = 1) +
  geom_hline(yintercept = 0, linetype = "solid", color = "gray40", size = 1.5) +
  scale_color_manual(values = c("All" = "gray70", 
                                "pvalue < 0.05" = "blue", 
                                "padj < 0.05" = "red")) +
  scale_x_log10(labels = scales::scientific) + 
  theme_minimal() +
  labs(x = "mean of normalized counts", 
       y = "log fold change", 
       color = NULL)

plt
ggsave("./pictures_transpl/transpl_Сustom_MAplot_TCAD.tiff", plot = plt, width = 8, height = 6, dpi = 300, bg = "white")

Значимые результаты

signres_TCAD <- results(dds, contrast=c("condition", "no_complications", "TCAD"), alpha=0.05) 
summary(signres_TCAD)

out of 297 with nonzero total read count
adjusted p-value < 0.05
LFC > 0 (up)       : 1, 0.34%
LFC < 0 (down)     : 0, 0%
outliers [1]       : 1, 0.34%
low counts [2]     : 0, 0%
(mean count < 8)
[1] see 'cooksCutoff' argument of ?results
[2] see 'independentFiltering' argument of ?results

Volcano plot

plt <- EnhancedVolcano(res_TCAD,
                lab = rownames(res_TCAD),
                x = "log2FoldChange",
                y = "padj",
                pCutoff = 0.05,
                FCcutoff = 1,
                labSize = 3.0,
                boxedLabels = FALSE,
                col = c('black', '#CBD5E8', '#B3E2CD', '#FDCDAC'),
                colAlpha = 1,
                title = NULL,        
                subtitle = NULL) 

plt
ggsave("./pictures_transpl/transpl_VolcanoPlot_TCAD.tiff", plot = plt, width = 8, height = 6, dpi = 300, bg = "white")

Анализ обогащения TCAD

res_sign_TCAD <- subset(res_TCAD, padj < 0.05 & !is.na(padj) & abs(log2FoldChange) > 1.0)

up_TCAD <- res_sign_TCAD %>% 
  as.data.frame() %>% 
  filter(log2FoldChange > 0)

rownames(up_TCAD)
[1] "Hsa-Mir-582_3p"
mirna_names_up <- "hsa-miR-582-3p"
converted_mirna_up <- miRNAVersionConvert(mirna_names_up)
converted_mirna_up

Запрос таргетов из базы multiMi

targets_TCAD_up <- unique(get_multimir(org = "hsa", mirna = converted_mirna_down$Accession, table = "validated")@data$target_symbol)
Searching mirecords ...
Searching mirtarbase ...
Searching tarbase ...
targets_TCAD_up
  [1] "ARF3"      "CPNE3"     "B4GALT1"   "ALDH9A1"   "RASA1"     "AXIN2"    
  [7] "ENTPD4"    "AMD1"      "CEACAM5"   "CHRM2"     "EIF4EBP2"  "GRM5"     
 [13] "KCNC1"     "MPP2"      "MYO1C"     "PGGT1B"    "RAB27A"    "RREB1"    
 [19] "SCN4B"     "SFRP1"     "SOX9"      "STC2"      "TNIP1"     "MED13L"   
 [25] "SLC25A37"  "GNL3L"     "WBP1L"     "PTCD3"     "RBM28"     "CEP55"    
 [31] "PRPF38A"   "DIXDC1"    "LRRK2"     "GRPEL2"    "DUSP18"    "SLC16A9"  
 [37] "ARL10"     "NFS1"      "GRM6"      "DKK3"      "SMIM15"    "MYL12B"   
 [43] "ZNF716"    "MAP4K4"    "CXCL14"    "CCS"       "KRR1"      "NCLN"     
 [49] "SSX5"      "ARHGEF39"  "C10orf67"  "FER"       "FSD2"      "GAN"      
 [55] "SURF4"     "INO80D"    "SELENOI"   "NOL4L"     "LENG9"     "RTL8C"    
 [61] "ESS2"      "FHIP2A"    "PTEN"      "MAPK14"    "SMC1A"     "BCL2"     
 [67] "NFIA"      "NCOA3"     "ERBB2"     "NRAS"      "PLAG1"     "LAMC1"    
 [73] "ZFP36L2"   "ERH"       "UHMK1"     "MMD"       "ANKIB1"    "DDX5"     
 [79] "RABGAP1L"  "RNF138"    "TPM4"      "OAT"       "G3BP1"     "NCOA2"    
 [85] "API5"      "TJP1"      "CAMTA1"    "CD44"      "HIPK3"     "BMPR2"    
 [91] "SP3"       "HMGA2"     "SERBP1"    "HADHB"     "ABHD5"     "SWAP70"   
 [97] "QSER1"     "PTBP1"     "BAZ1A"     "CD83"      "CMTM4"     "HERPUD1"  
[103] "ASXL2"     "PWWP2A"    "MSH2"      "PDCD6IP"   "PHKB"      "PNN"      
[109] "NOTCH2"    "RHOA"      "BCL2L11"   "MAPK9"     "MYB"       "HIF1A"    
[115] "CRKL"      "KIF1A"     "ITCH"      "CCND2"     "TRPS1"     "MBNL2"    
[121] "CAPRIN1"   "CDH11"     "FBN2"      "YAP1"      "ELK3"      "ROCK2"    
[127] "AGO2"      "AGO3"      "CCNA2"     "NR4A2"     "DNMT1"     "EIF4G2"   
[133] "SMAD2"     "FBXO28"    "ST14"      "RDX"       "TNPO1"     "ZFP91"    
[139] "ADAM17"    "UBAP2"     "ATM"       "WNK1"      "RHOBTB1"   "ELAVL1"   
[145] "NOG"       "CTCF"      "ZBTB20"    "ABL2"      "ACADVL"    "ACTN4"    
[151] "ACTN1"     "PARP1"     "AP2A2"     "AP1G1"     "AGL"       "ALCAM"    
[157] "ALDH3A2"   "ALPI"      "SLC25A6"   "BIRC3"     "ARHGAP5"   "ASPH"     
[163] "ZFHX3"     "KLF5"      "DDR1"      "CACNA2D1"  "CALM1"     "CAMK4"    
[169] "CAPZA2"    "CCNB1"     "CD47"      "CDC5L"     "CFL1"      "CHD1"     
[175] "LYST"      "CLCN5"     "TPP1"      "CLTC"      "COPA"      "SLC31A1"  
[181] "CPT1A"     "CREBBP"    "CSNK1G3"   "CTNNB1"    "CYP24A1"   "CYP51A1"  
[187] "DAB2"      "DDB1"      "GADD45A"   "DMXL1"     "TIMM8A"    "DYNC1H1"  
[193] "DR1"       "DSG2"      "DUSP1"     "EEF2"      "EGR1"      "EIF2S3"   
[199] "EIF4B"     "EIF5"      "EP300"     "BPTF"      "FGF2"      "FLOT2"    
[205] "FN1"       "FUT8"      "GFPT1"     "GFRA1"     "GLG1"      "GLO1"     
[211] "GNB1"      "GOLGA3"    "GOLGB1"    "GPD2"      "GRIN2A"    "GSTP1"    
[217] "HCCS"      "HTT"       "HIVEP2"    "FOXN2"     "IGF1R"     "IGFBP4"   
[223] "INHBB"     "JUP"       "KCNN2"     "KPNA2"     "LGALS3BP"  "SMAD3"    
[229] "MAPT"      "MAT2A"     "MBNL1"     "MCM3"      "MCM6"      "MCM7"     
[235] "KMT2A"     "NEO1"      "NFATC3"    "NFE2L2"    "NUP98"     "OPA1"     
[241] "ORC2"      "PRDX1"     "PFKFB2"    "PLAGL2"    "PLEC"      "PLOD2"    
[247] "PLSCR1"    "PPP1CB"    "PPP1CC"    "PPP2R1A"   "PKN1"      "MAPK6"    
[253] "MAPK8"     "EIF2AK2"   "PTPN9"     "PURA"      "RAD23B"    "RASA2"    
[259] "RCN1"      "RECQL"     "REV3L"     "RGS16"     "ROBO2"     "RPL6"     
[265] "CLIP1"     "RSU1"      "RXRB"      "CXCL5"     "SRSF2"     "TRA2B"    
[271] "SLC1A5"    "SLC5A3"    "SLC20A1"   "SMARCB1"   "SON"       "SSR1"     
[277] "STRN"      "STXBP2"    "TBL1X"     "TCF12"     "PPP1R11"   "TMBIM6"   
[283] "NR2F2"     "TFRC"      "TMF1"      "TMPO"      "TOP1"      "NR2C2"    
[289] "TRIO"      "TXNRD1"    "UBE2D2"    "UBE2D3"    "UBE2G1"    "UBE2H"    
[295] "UBE2N"     "UBP1"      "UGCG"      "UCK2"      "VDAC2"     "VEGFC"    
[301] "WNT7B"     "SF1"       "ZNF711"    "ZMYM2"     "ZNF207"    "SLC30A1"  
[307] "LUZP1"     "SLBP"      "REEP5"     "PRRC2A"    "DDX39B"    "KAT6A"    
[313] "SLC25A16"  "SHOC2"     "PTP4A2"    "SLC7A5"    "NRIP1"     "USP9X"    
[319] "ARID1A"    "TRRAP"     "EEA1"      "CUL4B"     "PKP4"      "ENC1"     
[325] "COPS3"     "CASK"      "FAM193A"   "CDK13"     "RTCA"      "EIF3G"    
[331] "EIF3I"     "EIF3J"     "STX16"     "BECN1"     "SRSF9"     "ASAP2"    
[337] "ALDH1A2"   "FUBP3"     "USP10"     "MTMR4"     "SMC3"      "SCAF11"   
[343] "BUB3"      "DDX21"     "CCPG1"     "SRSF11"    "NREP"      "TRIP12"   
[349] "GTF3C5"    "GTF3C4"    "GTF3C3"    "EFTUD2"    "LIPG"      "QKI"      
[355] "BAG4"      "RBM39"     "NUP155"    "RAPGEF2"   "USP6NL"    "DOCK4"    
[361] "USP34"     "LAPTM4A"   "MLEC"      "DHX38"     "CKAP5"     "TSC22D2"  
[367] "MELK"      "AREL1"     "FCHSD2"    "TOX4"      "SMG7"      "LPGAT1"   
[373] "AMMECR1"   "MED13"     "NUP153"    "PTBP3"     "ACOT8"     "PDCD6"    
[379] "UBA2"      "HUWE1"     "LRPPRC"    "RBM12"     "ABI2"      "LHFPL2"   
[385] "ALG3"      "DDX39A"    "IKZF1"     "CITED2"    "TUBA1B"    "VTI1B"    
[391] "SYNCRIP"   "UNC13B"    "DDX17"     "IPO7"      "ANP32B"    "ARL6IP5"  
[397] "AGPAT1"    "CCT2"      "MTHFS"     "IVNS1ABP"  "EXOC5"     "CELF2"    
[403] "NFAT5"     "STAG2"     "AHCYL1"    "ARPP21"    "WDR3"      "BRD8"     
[409] "PAPOLA"    "DBF4"      "KDELR1"    "YWHAQ"     "COPS5"     "METAP2"   
[415] "ATF7"      "CPSF6"     "CDC37"     "LSM6"      "XPOT"      "ATXN2L"   
[421] "RRAS2"     "XRN2"      "PPM1E"     "FNDC3A"    "ATG14"     "TMCC1"    
[427] "XPO7"      "FNBP1"     "SMG1"      "NCOA6"     "ZNF609"    "PPRC1"    
[433] "TTLL5"     "TNRC6B"    "POGZ"      "WDR43"     "FAM120A"   "FAF2"     
[439] "PSME4"     "ATP11B"    "SYNE2"     "RPRD2"     "DDHD2"     "MGA"      
[445] "NUP160"    "WWC1"      "BICD2"     "DMXL2"     "SMCHD1"    "LARP1"    
[451] "ZDHHC17"   "ADNP"      "RYBP"      "CBX6"      "PHF3"      "PES1"     
[457] "MACF1"     "LRRC8B"    "SRRM2"     "ZNF281"    "LEMD3"     "ORC3"     
[463] "CD2AP"     "ABTB2"     "DCAF12"    "RNF19A"    "NOL11"     "ZNF385A"  
[469] "GORASP2"   "GLCE"      "ANKRD17"   "APPL1"     "HERC4"     "MYOF"     
[475] "OSTF1"     "RPS6KC1"   "AP3M1"     "RNF11"     "RRP7A"     "SLCO4A1"  
[481] "BZW2"      "REPIN1"    "GRHL1"     "RBM15B"    "SNX12"     "NRBP1"    
[487] "UBQLN2"    "BAZ2B"     "ITSN2"     "ASAP1"     "CDON"      "GLRX2"    
[493] "DYNC1LI1"  "CERCAM"    "NAGPA"     "TUBD1"     "LEF1"      "SPTBN5"   
[499] "UBR5"      "CTDSPL2"   "TRIM33"    "ZFR"       "PCBP3"     "SLC38A2"  
[505] "DNAJC10"   "DDX56"     "PAF1"      "KLHL24"    "SWT1"      "VPS13C"   
[511] "SYTL2"     "TMEM248"   "VPS13D"    "PBRM1"     "ZNF532"    "SETD5"    
[517] "BBS7"      "PHF10"     "QRSL1"     "LRRC36"    "SLC39A9"   "LGR4"     
[523] "ETNK1"     "CHD7"      "SLC30A6"   "N4BP2"     "VPS35"     "ENAH"     
[529] "CCAR1"     "TMEM30A"   "TRERF1"    "ASH1L"     "KMT2E"     "RNF114"   
[535] "PDGFC"     "UBFD1"     "JPH1"      "CMC2"      "BBX"       "PHTF2"    
[541] "PELI1"     "ZMIZ1"     "BIRC6"     "KIAA1143"  "SCAF4"     "HEG1"     
[547] "NLGN4X"    "TAOK1"     "ARHGAP21"  "WDFY1"     "EP400"     "EPB41L5"  
[553] "KMT2C"     "AASDHPPT"  "ABHD4"     "GOLPH3"    "LMBR1"     "ZMAT3"    
[559] "NUCKS1"    "RMND5A"    "REEP1"     "MARCKSL1"  "UBE2Z"     "AHNAK"    
[565] "KCTD15"    "TBL1XR1"   "SLTM"      "MCMBP"     "PHC3"      "NAA25"    
[571] "CHD9"      "PAAF1"     "WDR26"     "KLHL15"    "TNKS2"     "DDHD1"    
[577] "DUSP16"    "APOLD1"    "C6orf62"   "SLIRP"     "AIF1L"     "AMMECR1L" 
[583] "STK40"     "ZNRF3"     "ZNF644"    "ARID5B"    "ANTXR1"    "PHF6"     
[589] "MCM8"      "GLYR1"     "UNC119B"   "FUT10"     "ZC3H12C"   "R3HDM4"   
[595] "TMEM259"   "LONRF1"    "MTDH"      "MOB1B"     "FAM114A1"  "ZNF618"   
[601] "MALSU1"    "FOXP4"     "AGAP1"     "FAT3"      "LRIG3"     "NEDD1"    
[607] "IKBIP"     "ARL8A"     "NUP35"     "FAM168B"   "DCBLD2"    "LIN54"    
[613] "PACRGL"    "STXBP5"    "BRI3BP"    "ANKRD46"   "FAM91A1"   "USP54"    
[619] "TMTC2"     "PPTC7"     "DGKH"      "SPRED1"    "TOR1AIP2"  "MIER3"    
[625] "TMEM64"    "ZNF384"    "SPRED2"    "TUBB"      "HIPK1"     "MRPL21"   
[631] "PRR14L"    "STEAP2"    "GAS2L3"    "SREK1IP1"  "LURAP1L"   "TTC6"     
[637] "SPOPL"     "IRF2BP2"   "NHLRC2"    "MAST4"     "SNX19"     "ZBTB34"   
[643] "CCDC88C"   "GPX8"      "BRD2"      "CCNB2"     "DBNDD2"    "ADRB2"    
[649] "PTCH1"     "RPL37"     "GGA1"      "TCP1"      "CENPW"     "GOSR2"    
[655] "RPS20"     "CELF1"     "PARP2"     "RBM23"     "FAM222B"   "IKZF2"    
[661] "STRN3"     "PCBP2"     "RAP1GDS1"  "RC3H2"     "SIKE1"     "LDB1"     
[667] "TENM2"     "MICAL3"    "CNBP"      "GPBP1"     "NUDCD1"    "TBCEL"    
[673] "JDP2"      "ARHGAP26"  "NRXN1"     "ZBTB43"    "PUF60"     "ARFGAP3"  
[679] "PIEZO1"    "CDYL"      "AMFR"      "TMX2"      "SDK2"      "SETDB1"   
[685] "SAP130"    "PTGR1"     "EWSR1"     "AMACR"     "CADM2"     "STIM2"    
[691] "CAMTA2"    "FOXP2"     "TTC27"     "DCLK1"     "VAPB"      "OXR1"     
[697] "HMGN3"     "ZNF664"    "SLC19A1"   "ZFAND6"    "KIAA0586"  "SLC30A5"  
[703] "CTNND2"    "DHX9"      "COX7A2"    "ELK4"      "KPNB1"     "PPP2CA"   
[709] "PSMB2"     "PSMD13"    "SH3GL3"    "TFAM"      "UBA1"      "SMARCA5"  
[715] "PPFIA1"    "HERC1"     "JMJD1C"    "ASCL1"     "PIWIL1"    "ZFYVE9"   
[721] "TM9SF2"    "ATG5"      "AQP3"      "DDX1"      "RAC3"      "THRAP3"   
[727] "GNL1"      "HLA-B"     "TCF20"     "ARPC2"     "ARIH1"     "NUTF2"    
[733] "SF3B4"     "PRCC"      "OLFM1"     "CCT4"      "POLR3C"    "LGALS8"   
[739] "CGRRF1"    "SRCAP"     "LMO4"      "ZMYM6"     "TPX2"      "KIAA1549L"
[745] "ZMYND8"    "SNRNP200"  "SETD2"     "CRIPT"     "CNOT3"     "UBXN4"    
[751] "AQR"       "CEP104"    "SART3"     "RNF10"     "TRAPPC8"   "KLHDC10"  
[757] "TRAK2"     "R3HDM1"    "PTPN23"    "AAR2"      "ADIPOR1"   "OTUD6B"   
[763] "DESI2"     "COPS4"     "TRAPPC4"   "TAOK3"     "CNOT1"     "DDX47"    
[769] "RBM38"     "SCYL2"     "YEATS2"    "SAMD4B"    "AKIRIN2"   "ATF7IP"   
[775] "TMEM39A"   "TMEM242"   "MYO5C"     "YLPM1"     "GPCPD1"    "WDR45B"   
[781] "NMT1"      "ZNF462"    "ZNF277"    "ZNF335"    "ZNF106"    "INTS3"    
[787] "ZNF649"    "IRX3"      "ZMIZ2"     "HPS3"      "MPV17L2"   "CSRNP1"   
[793] "SMDT1"     "CREB3L1"   "ESCO1"     "C1orf131"  "ARHGAP42"  "ZNF362"   
[799] "RNF168"    "YTHDF3"    "C2orf69"   "CCDC117"   "PRTG"      "COX18"    
[805] "PLD6"      "ZNF714"    "UBALD2"    "CARM1"     "COX4I1"    "NBEAL2"   
[811] "METTL22"   "FBL"       "LEO1"      "REC8"      "OR4K13"    "MT-ATP6"  
[817] "RPS21"     "TUG1"      "ZBED6"     "CNIH1"     "MIEF1"     "DYNLL2"   
[823] "ERBIN"     "ADGRG2"    "MAP1LC3B2" "TUBGCP5"   "PPP4R3B"   "RIC1"     
[829] "BORCS7"    "SRPRA"     "SLF2"      "CCL3"      "ADGRL2"    "ERO1A"    
[835] "KMT2B"     "SUSD6"     "PCNX1"     "SELENOT"   "EMSY"      "LNPK"     
[841] "MFSD14B"   "ZCCHC3"    "NSD2"      "MINDY2"    "WASHC4"    "NSD3"     
[847] "SEPTIN2"   "SEPTIN7"   "SHISAL1"   "RBIS"      "HARS1"     "MACO1"    
[853] "GARS1"     "SEPTIN10"  "ATP5PB"    "VIRMA"     "TENT5C"    "CRACD"    
[859] "BLTP2"     "ZNF275"    "CYB5R4"    "BLTP1"     "MCL1"      "ATP5MK"   
[865] "HAPSTR1"   "CRACDL"    "FEZ1"      "U2AF1"     "MCTS2"    

Анализ обогащения из базы биологических процессов

GO_enrich_up_TCAD_bp <- enrichGO(
  gene          = targets_TCAD_up,  
  OrgDb         = org.Hs.eg.db,
  keyType       = "SYMBOL",
  ont           = "BP", 
  pAdjustMethod = "BH",
  qvalueCutoff  = 0.05
)

Визуализация

p1 <- dotplot(GO_enrich_up_TCAD_bp, showCategory = 20) + 
  ggtitle("GO Enrichment for UPregulated targets") + 
  theme(
    plot.title = element_text(size = 12, face = "bold"),
    axis.text.y = element_text(size = 11)
  )

p1

ggsave("./pictures_transpl/transpl_GO_enrichment_dotplot_up_TCAD_bp.tiff", plot = p1, width = 16, height = 10, dpi = 300)

GO_enrich_UP_TCAD_bp <- enrichplot::pairwise_termsim(GO_enrich_up_TCAD_bp, method = "JC")

plt <- emapplot(GO_enrich_UP_TCAD_bp, 
         repel = TRUE,
         showCategory = 20) +
  ggtitle("Biological processes for UPregulated targets for TCAD") +
  theme(
    plot.title = element_text(size = 12, face = "bold"),
    axis.text = element_text(size = 3)
    )    

plt

ggsave("./pictures_transpl/transpl_GO_enrichment_emapplot_up_TCAD_BP.tiff", plot = plt, width = 16, height = 10, dpi = 300)

LS0tCnRpdGxlOiAibWljcm8tUk5BIEhlYXJ0IFRyYW5zcGxhbnRhdGlvbiIKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6IGRlZmF1bHQKLS0tCioq0KPRgdGC0LDQvdCw0LLQu9C40LLQsNC10Lwg0L3QtdC+0LHRhdC+0LTQuNC80YvQtSDQsdC40LHQu9C40L7RgtC60LgqKgpgYGB7cn0KbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkoREVTZXEyKQpsaWJyYXJ5KHBoZWF0bWFwKQpsaWJyYXJ5KFJDb2xvckJyZXdlcikKbGlicmFyeShjbHVzdGVyUHJvZmlsZXIpCmxpYnJhcnkoYmlvbWFSdCkKbGlicmFyeShvcmcuSHMuZWcuZGIpCmxpYnJhcnkoRW5oYW5jZWRWb2xjYW5vKQpsaWJyYXJ5KEdlbm9taWNSYW5nZXMpCmxpYnJhcnkobXNpZ2RicikKbGlicmFyeShtdWx0aU1pUikKbGlicmFyeShtaVJCYXNlQ29udmVydGVyKQpsaWJyYXJ5KGVucmljaHBsb3QpCmxpYnJhcnkodnNuKQpsaWJyYXJ5KHJ2ZXN0KQpsaWJyYXJ5KHBhdGNod29yaykKbGlicmFyeShkYnBseXIpCmBgYAojIyDQmNC80L/QvtGA0YLQuNGA0YPQtdC8INC00LDQvdC90YvQtQpgYGB7cn0KY29sZGF0YSA8LSByZWFkX3RzdigiZGF0YS9waGVub3RhYmxlLnRzdiIsIHNob3dfY29sX3R5cGVzID0gRkFMU0UpCnJvd25hbWVzKGNvbGRhdGEpIDwtIGNvbGRhdGEkc2FtcGxlCmNvbGRhdGEKYGBgCgpgYGB7cn0KY291bnRzIDwtIHJlYWQuY3N2KCJkYXRhL21pUi5Db3VudHMuY3N2IiwgaGVhZGVyID0gVFJVRSwgc2VwID0gIiwiKQpjb3VudHMgPC0gY29sdW1uX3RvX3Jvd25hbWVzKGNvdW50cywgdmFyID0gIm1pUk5BIikKaGVhZChjb3VudHMpCmBgYApgYGB7cn0KY29sbmFtZXMoY291bnRzKSA8LSBnc3ViKCJeWCIsICIiLCBjb2xuYW1lcyhjb3VudHMpKQoKY291bnRzX3NhbXBsZXMgPC0gY29sbmFtZXMoY291bnRzKQpwaGVub3RhYmxlX3NhbXBsZXMgPC0gY29sZGF0YSRzYW1wbGUKY29tbW9uX3NhbXBsZXMgPC0gaW50ZXJzZWN0KGNvdW50c19zYW1wbGVzLCBwaGVub3RhYmxlX3NhbXBsZXMpCgpjb3VudHMgPC0gY291bnRzWywgYyhjb3VudHMkbWlSTkEsIGNvbW1vbl9zYW1wbGVzKV0gIApjb3VudHMgPC0gY291bnRzWywgcm93bmFtZXMoY29sZGF0YSldICPRgNCw0L3QttC40YDRg9GOINC/0L4g0LrQvtC70L7QvdC60Lgg0LIgY291bnRzINGC0LDQuiDQttC1INC60LDQuiDQuCDQvdCw0LfQstCw0L3QuNGPINGB0YLRgNC+0Log0LIgY29sZGF0YQpoZWFkKGNvdW50cykKYGBgCmBgYHtyfQphbm5vIDwtIHJlYWQuY3N2KCJkYXRhL2Fubm90YXRpb24ucmVwb3J0LmNzdiIsIGhlYWRlciA9IFRSVUUsIHNlcCA9ICIsIikKYW5ubyRTYW1wbGUubmFtZS5zLiA8LSBnc3ViKCItIiwgIi4iLCBhbm5vJFNhbXBsZS5uYW1lLnMuKQphbm5vIDwtIGFubm9bLCAtYygyOjUsIDcsIDE1KV0KCgpjb21tb25fc2FtcGxlcyA8LSBpbnRlcnNlY3QoYW5ubyRTYW1wbGUubmFtZS5zLiwgY29sZGF0YSRzYW1wbGUpCgphbm5vIDwtIGFubm9bYW5ubyRTYW1wbGUubmFtZS5zLiAlaW4lIGNvbW1vbl9zYW1wbGVzLCBdCmFubm8gPC0gYW5ub1ttYXRjaChyb3duYW1lcyhjb2xkYXRhKSwgYW5ubyRTYW1wbGUubmFtZS5zLiksIF0gI9GA0LDQvdC20LjRgNGD0Y4g0L/QviDQutC+0LvQvtC90LrQuCDQsiBjb3VudHMg0YLQsNC6INC20LUg0LrQsNC6INC4INC90LDQt9Cy0LDQvdC40Y8g0YHRgtGA0L7QuiDQsiBjb2xkYXRhCmFubm8KYGBgCiMjINCS0LXRgdGMINC00LDRgtCw0YHQtdGCCmBgYHtyfQphbm5vX2xvbmcgPC0gYW5ubyAlPiUKICBwaXZvdF9sb25nZXIoY29scyA9IC1TYW1wbGUubmFtZS5zLiwgbmFtZXNfdG8gPSAiUk5BX1R5cGUiLCB2YWx1ZXNfdG8gPSAiQ291bnQiKQoKcGx0IDwtIGdncGxvdChhbm5vX2xvbmcsIGFlcyh4ID0gU2FtcGxlLm5hbWUucy4sIHkgPSBDb3VudCwgZmlsbCA9IFJOQV9UeXBlKSkgKwogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICBsYWJzKHggPSAiU2FtcGxlIiwgeSA9ICJSZWFkIENvdW50IikgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSkpICsKICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIlNldDMiKSAgIyDQmtGA0LDRgdC40LLRi9C1INGG0LLQtdGC0LAKCnByaW50KHBsdCkKZ2dzYXZlKCIuL3BpY3R1cmVzX3RyYW5zcGwvdHJhbnNwbF9iYXJwbG90X2FsbGRhdGFzZXRfbm9fbm9ybWFsaXNlZC50aWZmIiwgcGxvdCA9IHBsdCwgd2lkdGggPSA4LCBoZWlnaHQgPSA2LCBkcGkgPSAzMDAsICBiZyA9ICJ3aGl0ZSIpCmBgYAoKYGBge3J9CmFubm9fbG9uZyA8LSBhbm5vICU+JQogIHJvd3dpc2UoKSAlPiUKICBtdXRhdGUoYWNyb3NzKC1TYW1wbGUubmFtZS5zLiwgfiAuIC8gc3VtKGNfYWNyb3NzKC1TYW1wbGUubmFtZS5zLikpKSkgJT4lIAogIHVuZ3JvdXAoKSAlPiUKICBwaXZvdF9sb25nZXIoY29scyA9IC1TYW1wbGUubmFtZS5zLiwgbmFtZXNfdG8gPSAiUk5BX1R5cGUiLCB2YWx1ZXNfdG8gPSAiUHJvcG9ydGlvbiIpCgpwbHQgPC0gZ2dwbG90KGFubm9fbG9uZywgYWVzKHggPSBTYW1wbGUubmFtZS5zLiwgeSA9IFByb3BvcnRpb24sIGZpbGwgPSBSTkFfVHlwZSkpICsKICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IikgKwogIHRoZW1lX21pbmltYWwoKSArCiAgbGFicyh4ID0gIlNhbXBsZSIsIHkgPSAiUHJvcG9ydGlvbiIpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpKSArCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJTZXQzIikKCnBsdApnZ3NhdmUoIi4vcGljdHVyZXNfdHJhbnNwbC90cmFuc3BsX2JhcnBsb3RfYWxsZGF0YXNldF9ub3JtYWxpc2VkLnRpZmYiLCBwbG90ID0gcGx0LCB3aWR0aCA9IDgsIGhlaWdodCA9IDYsIGRwaSA9IDMwMCwgYmcgPSAid2hpdGUiKQpgYGAKYGBge3J9CmNvbGRhdGEkY29uZGl0aW9uIDwtIHJlbGV2ZWwoZmFjdG9yKGNvbGRhdGEkY29uZGl0aW9uKSwgcmVmID0gIm5vX2NvbXBsaWNhdGlvbnMiKQptb2RlbE1hdHJpeCA8LSBtb2RlbC5tYXRyaXgofmNvbmRpdGlvbiwgY29sZGF0YSkKbW9kZWxNYXRyaXgKcXIobW9kZWxNYXRyaXgpJHJhbmsgICMg0YDQsNC90LMg0LzQsNGC0YDQuNGG0YsKbmNvbChtb2RlbE1hdHJpeCkgCmBgYAoKCmBgYHtyfQpkZHMgPC0gREVTZXFEYXRhU2V0RnJvbU1hdHJpeChjb3VudERhdGEgPSBjb3VudHMsIGNvbERhdGEgPSBjb2xkYXRhLCBkZXNpZ24gPSB+IGNvbmRpdGlvbikKZGRzJGNvbmRpdGlvbiA8LSByZWxldmVsKGRkcyRjb25kaXRpb24sIHJlZiA9ICJub19jb21wbGljYXRpb25zIikKZGRzCmBgYApgYGB7cn0KZGltKGRkcykKc21hbGxlc3RHcm91cFNpemUgPC0gMTUKa2VlcCA8LSByb3dTdW1zKGNvdW50cyhkZHMpID49IDEwKSA+PSBzbWFsbGVzdEdyb3VwU2l6ZQpkZHMgPC0gZGRzW2tlZXAsXQpkaW0oZGRzKQpgYGAKIyMjICBSdW4gRGlmZmVyZW50aWFsIEV4cHJlc3Npb24gQW5hbHlzaXMgIyMjCmBgYHtyfQpkZHMgPC0gREVTZXEoZGRzLCBmaXRUeXBlID0gInBhcmFtZXRyaWMiKQpkZHMKYGBgCgpgYGB7cn0KcGxvdERpc3BFc3RzKGRkcykKYGBgCmBgYHtyfQpyYXdfY291bnRzIDwtIGNvdW50cyhkZHMsIG5vcm1hbGl6ZWQgPSBGQUxTRSkKbm9ybWFsaXplZF9jb3VudHMgPC0gY291bnRzKGRkcywgbm9ybWFsaXplZCA9IFRSVUUpCgpkZiA8LSBkYXRhLmZyYW1lKAogIFNhbXBsZSA9IHJlcChjb2xuYW1lcyhkZHMpLCAyKSwKICBDb3VudHMgPSBjKGNvbFN1bXMocmF3X2NvdW50cyksIGNvbFN1bXMobm9ybWFsaXplZF9jb3VudHMpKSwKICBUeXBlID0gcmVwKGMoIlJhdyIsICJOb3JtYWxpemVkIiksIGVhY2ggPSBuY29sKGRkcykpCikKCnBsdCA8LSBnZ3Bsb3QoZGYsIGFlcyh4ID0gU2FtcGxlLCB5ID0gQ291bnRzLCBmaWxsID0gVHlwZSkpICsKICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSAiZG9kZ2UiKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICBsYWJzKHRpdGxlID0gIkNvdW50cyBiZWZvcmUgYW5kIGFmdGVyIG5vcm1hbGl6YXRpb24iLCB4ID0gIlNhbXBsZSIsIHkgPSAiVG90YWwgQ291bnRzIikgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSkpCgpwbHQKZ2dzYXZlKCIuL3BpY3R1cmVzX3RyYW5zcGwvdHJhbnNwbF9Db3VudHMgYmVmb3JlIGFuZCBhZnRlciBub3JtYWxpemF0aW9uLnRpZmYiLCBwbG90ID0gcGx0LCB3aWR0aCA9IDgsIGhlaWdodCA9IDYsIGRwaSA9IDMwMCwgYmcgPSAid2hpdGUiKQpgYGAKcmxvZyDRgtGA0LDQvdGB0YTQvtGA0LzQsNGG0LjRjwpgYGB7cn0Kcmx0IDwtIHJsb2coZGRzKSAgI3Jsb2cgVHJhbnNmb3JtYXRpb24KbWVhblNkUGxvdChhc3NheShybHQpKSAKCmBgYApgYGB7cn0KdnNkIDwtIHZhcmlhbmNlU3RhYmlsaXppbmdUcmFuc2Zvcm1hdGlvbihkZHMsIGJsaW5kPUZBTFNFKSAKbWVhblNkUGxvdChhc3NheSh2c2QpKSAj0L/QvtC60LDQt9GL0LLQsNC10YIsINC60LDQuiDQuNC30LzQtdC90Y/QtdGC0YHRjyDRgdGC0LDQvdC00LDRgNGC0L3QvtC1INC+0YLQutC70L7QvdC10L3QuNC1INCyINC30LDQstC40YHQuNC80L7RgdGC0Lgg0L7RgiDRgdGA0LXQtNC90LXQs9C+INC30L3QsNGH0LXQvdC40Y8g0Y3QutGB0L/RgNC10YHRgdC40LgKYGBgCgoqKiBQQ0EgcGxvdCAqKgpgYGB7cn0KcGNhRGF0YSA8LSBwbG90UENBKHJsdCwgaW50Z3JvdXA9YygiY29uZGl0aW9uIiksIHJldHVybkRhdGEgPSBUUlVFKQpwZXJjZW50VmFyIDwtIHJvdW5kKDEwMCAqIGF0dHIocGNhRGF0YSwgInBlcmNlbnRWYXIiKSkKCnBjYURhdGEkc2FtcGxlIDwtIGdzdWIoIl8uKiIsICIiLCBjb2xkYXRhJHNhbXBsZSkKCgpwbHQgPC0gZ2dwbG90KHBjYURhdGEsIGFlcyhQQzEsIFBDMiwgY29sb3IgPSBjb25kaXRpb24pKSArCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbD1zYW1wbGUpLCBzaXplPTMsIHZqdXN0PTEuNSkgKwogIGdlb21fcG9pbnQoc2l6ZSA9IDMpICsKICB4bGFiKHBhc3RlMCgiUEMxOiAiLCBwZXJjZW50VmFyWzFdLCAiJSIpKSArCiAgeWxhYihwYXN0ZTAoIlBDMjogIiwgcGVyY2VudFZhclsyXSwgIiUiKSkgKyAKICBjb29yZF9maXhlZCgpICsKICB0aGVtZV9idygpICsKICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZSA9ICJTZXQyIikKcGx0Cmdnc2F2ZSgiLi9waWN0dXJlc190cmFuc3BsL3RyYW5zcGxfUENBIHBsb3QudGlmZiIsIHBsb3QgPSBwbHQsIHdpZHRoID0gOCwgaGVpZ2h0ID0gNiwgZHBpID0gMzAwLCBiZyA9ICJ3aGl0ZSIpCmBgYAoKKipQbG90IGEgaGVhdG1hcCBvZiA1MCBtb3N0IGV4cHJlc3NlZCBnZW5lcyoqCtCt0YLQvtGCIGhlYXRtYXAg0L7RgtGA0LDQttCw0LXRgiDRg9GA0L7QstC90Lgg0Y3QutGB0L/RgNC10YHRgdC40Lgg0LPQtdC90L7Qsiwg0LAg0L3QtSDRgNCw0LfQvdC40YbRgyDQvNC10LbQtNGDINCz0YDRg9C/0L/QsNC80LguCtCm0LLQtdGC0LAg0L3QtSDQvtC30L3QsNGH0LDRjtGCIHVwLSDQuNC70LggZG93bi3RgNC10LPRg9C70Y/RhtC40Y4g0LIg0YHRgNCw0LLQvdC10L3QuNC4INGBINC60L7QvdGC0YDQvtC70YzQvdC+0Lkg0LPRgNGD0L/Qv9C+0LksINC/0L7RgtC+0LzRgyDRh9GC0L4gaGVhdG1hcCDQv9C+0LrQsNC30YvQstCw0LXRgiDQsNCx0YHQvtC70Y7RgtC90YvQtSDQt9C90LDRh9C10L3QuNGPINGN0LrRgdC/0YDQtdGB0YHQuNC4LCDQsCDQvdC1IGZvbGQgY2hhbmdlIQpgYGB7cn0Kc2VsZWN0IDwtIG9yZGVyKHJvd01lYW5zKGNvdW50cyhkZHMsbm9ybWFsaXplZD1UUlVFKSksCiAgICAgICAgICAgICAgICBkZWNyZWFzaW5nPVRSVUUpWzE6NTBdCmRmIDwtIGFzLmRhdGEuZnJhbWUoY29sRGF0YShkZHMpJGNvbmRpdGlvbikKY29sbmFtZXMoZGYpIDwtICJjb25kaXRpb24iCnJvd25hbWVzKGRmKSA8LSBjb2xuYW1lcyhjb3VudHMoZGRzKSkKcGx0IDwtIHBoZWF0bWFwKGFzc2F5KHJsdClbc2VsZWN0LF0sIAogICAgICAgICBjbHVzdGVyX3Jvd3MgPSBUUlVFLCAKICAgICAgICAgc2hvd19yb3duYW1lcyA9IFRSVUUsIAogICAgICAgICBjbHVzdGVyX2NvbHMgPSBUUlVFLCAKICAgICAgICAgYW5ub3RhdGlvbl9jb2wgPSBkZiwKICAgICAgICAgZm9udHNpemVfcm93ID0gNikgCgpwbHQKZ2dzYXZlKCIuL3BpY3R1cmVzX3RyYW5zcGwvdHJhbnNwbF9QbG90IGEgaGVhdG1hcCBvZiA1MCBtb3N0IGV4cHJlc3NlZCBnZW5lcy50aWZmIiwgcGxvdCA9IHBsdCwgd2lkdGggPSA4LCBoZWlnaHQgPSA2LCBkcGkgPSAzMDAsIGJnID0gIndoaXRlIikKYGBgCioqUGxvdCBvZiB0aGUgZGlzdGFuY2UgYmV0d2VlbiBzYW1wbGVzIGhlYXRtYXAqKgrQoNCw0YHRh9C10YIg0YDQsNGB0YHRgtC+0Y/QvdC40Lkg0LzQtdC20LTRgyDQvtCx0YDQsNC30YbQsNC80LgKCeKAognQntCx0YvRh9C90L4g0LjRgdC/0L7Qu9GM0LfRg9C10YLRgdGPINC10LLQutC70LjQtNC+0LLQviDRgNCw0YHRgdGC0L7Rj9C90LjQtSAo0L/QviDRg9C80L7Qu9GH0LDQvdC40Y4g0LIgREVTZXEyKS4KCeKAognQntC90L4g0LLRi9GH0LjRgdC70Y/QtdGC0YHRjyDQv9C+INC90L7RgNC80LDQu9C40LfQvtCy0LDQvdC90YvQvCDQtNCw0L3QvdGL0Lwg0Y3QutGB0L/RgNC10YHRgdC40LggKHJsb2coKSDQuNC70LggdnN0KCkpLgoJ4oCiCdCn0LXQvCDQvNC10L3RjNGI0LUg0YDQsNGB0YHRgtC+0Y/QvdC40LUg4oCUINGC0LXQvCDQsdC+0LvQtdC1INC/0L7RhdC+0LbQuCDQvtCx0YDQsNC30YbRiy4KYGBge3J9CnNhbXBsZURpc3RzIDwtIGRpc3QodChhc3NheShybHQpKSkKc2FtcGxlRGlzdE1hdHJpeCA8LSBhcy5tYXRyaXgoc2FtcGxlRGlzdHMpCnJvd25hbWVzKHNhbXBsZURpc3RNYXRyaXgpIDwtIHBhc3RlKHJsdCRjb25kaXRpb24pCmNvbG5hbWVzKHNhbXBsZURpc3RNYXRyaXgpIDwtIHBhc3RlKHJsdCRjb25kaXRpb24pCmNvbG9ycyA8LSBjb2xvclJhbXBQYWxldHRlKHJldihicmV3ZXIucGFsKDksICJCbHVlcyIpKSApKDI1NSkKCnBsdCA8LSBwaGVhdG1hcChzYW1wbGVEaXN0TWF0cml4LAogICAgICAgICBjbHVzdGVyaW5nX2Rpc3RhbmNlX3Jvd3MgPSAiZXVjbGlkZWFuIiwKICAgICAgICAgY2x1c3RlcmluZ19kaXN0YW5jZV9jb2xzID0gImV1Y2xpZGVhbiIsCiAgICAgICAgIGNvbG9yID0gY29sb3JzKQoKcGx0Cmdnc2F2ZSgiLi9waWN0dXJlc190cmFuc3BsL3RyYW5zcGxfUGxvdCBvZiB0aGUgZGlzdGFuY2UgYmV0d2VlbiBzYW1wbGVzIGhlYXRtYXAudGlmZiIsIHBsb3QgPSBwbHQsIHdpZHRoID0gOCwgaGVpZ2h0ID0gNiwgZHBpID0gMzAwLCBiZyA9ICJ3aGl0ZSIpCmBgYApgYGB7cn0KcmVzX2h1bW9yYWwgPC0gcmVzdWx0cyhkZHMsIGNvbnRyYXN0PWMoImNvbmRpdGlvbiIsICJub19jb21wbGljYXRpb25zIiwgImh1bW9yYWwiKSkKcmVzX2h1bW9yYWwKYGBgCioqTUEgcGxvdCoqCtCk0LjQu9GM0YLRgNCw0YbQuNGPINGC0L7Rh9C10Log0YEg0L3QuNC30LrQuNC8INGB0YDQtdC00L3QuNC8INGN0LrRgdC/0YDQtdGB0YHQuNGA0L7QstCw0L3QuNC10LwgKNC/0L4gYmFzZU1lYW4pLgoJ4oCiCdCe0LHRi9GH0L3QviDQvtGC0YHQtdC60LDRjtGC0YHRjyBiYXNlTWVhbiA8IDEuCgkyLgnQntC/0YDQtdC00LXQu9C10L3QuNC1INC30L3QsNGH0LjQvNGL0YUg0LPQtdC90L7QsiAo0YHQuNC90LjQtSDRgtC+0YfQutC4KToKCeKAognQmNGB0L/QvtC70YzQt9GD0LXRgtGB0Y8g0LrRgNC40YLQtdGA0LjQuSBwYWRqIDwgMC4xINC/0L4g0YPQvNC+0LvRh9Cw0L3QuNGOLCDQsCDQvdC1IDwgMC4wNSEgCmBgYHtyfQp0aWZmKCIuL3BpY3R1cmVzX3RyYW5zcGwvdHJhbnNwbF9QbG90TUFfc3RhbmRhcnRfcGFkal8wLjA1X2h1bW9yYWwudGlmZiIsIAogICAgIHdpZHRoID0gOCwgaGVpZ2h0ID0gNiwgdW5pdHMgPSAiaW4iLCByZXMgPSAzMDAsIGJnID0gIndoaXRlIikKcGxvdE1BKHJlc19odW1vcmFsLCBhbHBoYSA9IDAuMDUsIHlsaW0gPSBjKC04LCA4KSkgCmRldi5vZmYoKQpwbG90TUEocmVzX2h1bW9yYWwsIGFscGhhID0gMC4wNSwgeWxpbSA9IGMoLTgsIDgpKSAKYGBgCioq0JrQsNGB0YLQvtC80L3Ri9C5IE1BIHBsb3QqKgpgYGB7cn0KcmVzX2RmIDwtIHJlc19odW1vcmFsICU+JQogIGFzLmRhdGEuZnJhbWUoKSAlPiUKICBtdXRhdGUoY29sb3IgPSBjYXNlX3doZW4oIAogICAgcGFkaiA8IDAuMDUgIH4gInBhZGogPCAwLjA1IiwgICAKICAgIHB2YWx1ZSA8IDAuMDUgIH4gInB2YWx1ZSA8IDAuMDUiLCAKICAgIFRSVUUgfiAiQWxsIgogICkpCgpwbHQgPC0gZ2dwbG90KHJlc19kZiwgYWVzKHggPSBiYXNlTWVhbiwgeSA9IGxvZzJGb2xkQ2hhbmdlLCBjb2xvciA9IGNvbG9yKSkgKwogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjcsIHNpemUgPSAxKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgbGluZXR5cGUgPSAic29saWQiLCBjb2xvciA9ICJncmF5NDAiLCBzaXplID0gMS41KSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoIkFsbCIgPSAiZ3JheTcwIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInB2YWx1ZSA8IDAuMDUiID0gImJsdWUiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGFkaiA8IDAuMDUiID0gInJlZCIpKSArCiAgc2NhbGVfeF9sb2cxMChsYWJlbHMgPSBzY2FsZXM6OnNjaWVudGlmaWMpICsgCiAgdGhlbWVfbWluaW1hbCgpICsKICBsYWJzKHggPSAibWVhbiBvZiBub3JtYWxpemVkIGNvdW50cyIsIAogICAgICAgeSA9ICJsb2cgZm9sZCBjaGFuZ2UiLCAKICAgICAgIGNvbG9yID0gTlVMTCkKCnBsdApnZ3NhdmUoIi4vcGljdHVyZXNfdHJhbnNwbC90cmFuc3BsX9ChdXN0b20gTUFwbG90X2h1bW9yYWwudGlmZiIsIHBsb3QgPSBwbHQsIHdpZHRoID0gOCwgaGVpZ2h0ID0gNiwgZHBpID0gMzAwLCBiZyA9ICJ3aGl0ZSIpCmBgYAoKKirQl9C90LDRh9C40LzRi9C1INGA0LXQt9GD0LvRjNGC0LDRgtGLKioKCjU4INCz0LXQvdC+0LIgKDIwJSkg0LjQvNC10Y7RgiDQvdC40LfQutC40LUg0YPRgNC+0LLQvdC4INGN0LrRgdC/0YDQtdGB0YHQuNC4INC4INGE0LjQu9GM0YLRgNGD0Y7RgtGB0Y8g0LjQtyDQsNC90LDQu9C40LfQsC4KaW5kZXBlbmRlbnQgZmlsdGVyaW5nIOKAlCDQv9GA0L7RhtC10LTRg9GA0LAsINC60L7RgtC+0YDQsNGPINC40YHQutC70Y7Rh9Cw0LXRgiDQs9C10L3RiyDRgSDQvdC40LfQutC40LzQuCDQt9C90LDRh9C10L3QuNGP0LzQuCDQtNC70Y8g0YPQstC10LvQuNGH0LXQvdC40Y8g0YHRgtCw0YLQuNGB0YLQuNGH0LXRgdC60L7QuSDQvNC+0YnQvdC+0YHRgtC4LgpgYGB7cn0Kc2lnbnJlc19odW1vcmFsIDwtIHJlc3VsdHMoZGRzLCBjb250cmFzdD1jKCJjb25kaXRpb24iLCAibm9fY29tcGxpY2F0aW9ucyIsICJodW1vcmFsIiksIGFscGhhPTAuMDUpIApzdW1tYXJ5KHNpZ25yZXNfaHVtb3JhbCkKYGBgCkxldCdzIGFycmFuZ2VkIGl0IGJ5IGxvZzJGb2xkQ2hhbmdlOgpgYGB7cn0Kb3JkZXJfaW5kaWNlcyA8LSBvcmRlcigtcmVzX2h1bW9yYWwkbG9nMkZvbGRDaGFuZ2UpCnJlc19odW1vcmFsW29yZGVyX2luZGljZXMsIF0KYGBgClZpc3VhbGlzYXRpb24gZm9yIHRoZSBmaXJzdCBnZW5lCmBgYHtyfQojcGxvdENvdW50cyhkZHMsIGdlbmU9d2hpY2gubWF4KHJlc19odW1vcmFsJGxvZzJGb2xkQ2hhbmdlKSwgaW50Z3JvdXA9ImNvbmRpdGlvbiIpCnBsb3RDb3VudHMoZGRzLCBnZW5lPXdoaWNoLm1pbihyZXNfaHVtb3JhbCRwYWRqKSwgaW50Z3JvdXA9ImNvbmRpdGlvbiIpCiNwbG90Q291bnRzKGRkcywgZ2VuZT1yb3duYW1lcyhyZXMpW3doaWNoLm1pbihyZXMkcGFkalt3aGljaC5tYXgocmVzJGxvZzJGb2xkQ2hhbmdlKV0pXSwgaW50Z3JvdXA9ImNvbmRpdGlvbiIpCmBgYAoqKlZvbGNhbm8gcGxvdCoqCmBgYHtyfQpwbHQgPC0gRW5oYW5jZWRWb2xjYW5vKHJlc19odW1vcmFsLAogICAgICAgICAgICAgICAgbGFiID0gcm93bmFtZXMocmVzX2h1bW9yYWwpLAogICAgICAgICAgICAgICAgeCA9ICJsb2cyRm9sZENoYW5nZSIsCiAgICAgICAgICAgICAgICB5ID0gInBhZGoiLAogICAgICAgICAgICAgICAgcEN1dG9mZiA9IDAuMDUsCiAgICAgICAgICAgICAgICBGQ2N1dG9mZiA9IDEsCiAgICAgICAgICAgICAgICBsYWJTaXplID0gMy4wLAogICAgICAgICAgICAgICAgYm94ZWRMYWJlbHMgPSBGQUxTRSwKICAgICAgICAgICAgICAgIGNvbCA9IGMoJ2JsYWNrJywgJyNDQkQ1RTgnLCAnI0IzRTJDRCcsICcjRkRDREFDJyksCiAgICAgICAgICAgICAgICBjb2xBbHBoYSA9IDEsCiAgICAgICAgICAgICAgICB0aXRsZSA9IE5VTEwsICAgICAgICAKICAgICAgICAgICAgICAgIHN1YnRpdGxlID0gTlVMTCkgCgpwbHQKZ2dzYXZlKCIuL3BpY3R1cmVzX3RyYW5zcGwvdHJhbnNwbF9Wb2xjYW5vUGxvdF9odW1vcmFsLnRpZmYiLCBwbG90ID0gcGx0LCB3aWR0aCA9IDgsIGhlaWdodCA9IDYsIGRwaSA9IDMwMCwgYmcgPSAid2hpdGUiKQpgYGAKYGBge3J9CmNvbGRhdGFfZmlsdGVyZWQgPC0gY29sZGF0YVtjb2xkYXRhJGNvbmRpdGlvbiAlaW4lIGMoImh1bW9yYWwiLCAibm9fY29tcGxpY2F0aW9ucyIpLCBdCmNvbGRhdGFfZmlsdGVyZWQKYGBgCgoqKlBsb3QgYSBoZWF0bWFwIG9mIGRpZmYgZXhwcmVzc2VkIGdlbmVzKioKYGBge3J9CnJlc19zaWduX2h1bW9yYWwgPC0gc3Vic2V0KHJlc19odW1vcmFsLCBwYWRqIDwgMC4wNSAmICFpcy5uYShwYWRqKSAmIGFicyhsb2cyRm9sZENoYW5nZSkgPiAxLjApCnJlc19zaWduX2h1bW9yYWwgPC0gcmVzX3NpZ25faHVtb3JhbFtvcmRlcihyZXNfc2lnbl9odW1vcmFsJGxvZzJGb2xkQ2hhbmdlLCBkZWNyZWFzaW5nID0gVFJVRSksIF0KCnNpZ19nZW5lcyA8LSByb3duYW1lcyhyZXNfc2lnbl9odW1vcmFsKSAgCgpkZV9tYXQgPC0gYXNzYXkocmx0KVtzaWdfZ2VuZXMsIF0gCgpkZV9tYXRfZmlsdGVyZWQgPC0gZGVfbWF0WywgY29sZGF0YV9maWx0ZXJlZCRzYW1wbGVdCiNkYXRhbWF0cml4IDwtIHQoc2NhbGUodChkZV9tYXRfZmlsdGVyZWQpKSkKZGF0YW1hdHJpeCA8LSBkZV9tYXRfZmlsdGVyZWQKCmFubm90YXRpb25fY29sIDwtIGRhdGEuZnJhbWUoY29uZGl0aW9uID0gY29sZGF0YV9maWx0ZXJlZCRjb25kaXRpb24pCnJvd25hbWVzKGFubm90YXRpb25fY29sKSA8LSBjb2xuYW1lcyhkYXRhbWF0cml4KQoKYW5ub3RhdGlvbl9jb2xvcnMgPC0gbGlzdCgKICBjb25kaXRpb24gPSBjKCJub19jb21wbGljYXRpb25zIiA9ICIjRkZDQzAwIiwgImh1bW9yYWwiID0gIiMzMzk5RkYiKSkKCnBsdCA8LSBwaGVhdG1hcChkYXRhbWF0cml4LAogICAgICAgICBjbHVzdGVyX3Jvd3MgPSBUUlVFLCAKICAgICAgICAgc2hvd19yb3duYW1lcyA9IFRSVUUsIAogICAgICAgICBjbHVzdGVyX2NvbHMgPSBUUlVFLCAKICAgICAgICAgYW5ub3RhdGlvbl9jb2wgPSBhbm5vdGF0aW9uX2NvbCwKICAgICAgICAgYW5ub3RhdGlvbl9jb2xvcnMgPSBhbm5vdGF0aW9uX2NvbG9ycywKICAgICAgICAgZGlzcGxheV9udW1iZXJzID0gRkFMU0UsCiAgICAgICAgIGxlZ2VuZCA9IFRSVUUsCiAgICAgICAgIGZvbnRzaXplID0gMTUpICAKCmdnc2F2ZSgiLi9waWN0dXJlc190cmFuc3BsL3RyYW5zcGxfSGVhdG1hcCBvZiBkaWZmIGV4cHJlc3NlZCBnZW5lc19odW1vcmFsLnRpZmYiLCBwbG90ID0gcGx0LCB3aWR0aCA9IDgsIGhlaWdodCA9IDYsIGRwaSA9IDMwMCwgYmcgPSAid2hpdGUiKQpgYGAKCgojIyMg0JDQvdCw0LvQuNC3INC+0LHQvtCz0LDRidC10L3QuNGPINCz0YPQvNC+0YDQsNC70YzQvdGL0Lkg0L7RgtCy0LXRgiAjIyMKYGBge3J9CnVwX2h1bW9yYWwgPC0gcmVzX3NpZ25faHVtb3JhbCAlPiUgCiAgYXMuZGF0YS5mcmFtZSgpICU+JSAKICBmaWx0ZXIobG9nMkZvbGRDaGFuZ2UgPiAwKQpkb3duX2h1bW9yYWwgPC0gcmVzX3NpZ25faHVtb3JhbCAlPiUgCiAgYXMuZGF0YS5mcmFtZSgpICU+JSAKICBmaWx0ZXIobG9nMkZvbGRDaGFuZ2UgPCAwKQpyb3duYW1lcyh1cF9odW1vcmFsKQpyb3duYW1lcyhkb3duX2h1bW9yYWwpCmBgYArQn9C10YDQtdCy0L7QtNC40Lwg0LIgbWlSQmFzZQoJ4oCiCW1pUkJhc2U6IGh0dHBzOi8vd3d3Lm1pcmJhc2Uub3JnLwoJ4oCiCU1pckdlbmVEQjogaHR0cHM6Ly9taXJnZW5lZGIub3JnLwpgYGB7cn0KdXJsIDwtICJodHRwczovL21pcmdlbmVkYi5vcmcvYnJvd3NlL2hzYSIKcGFnZSA8LSByZWFkX2h0bWwodXJsKQpgYGAKCtCf0LDRgNGB0LjQvCDRgtCw0LHQu9C40YbRgwpgYGB7cn0KbWlyX3RhYmxlIDwtIHBhZ2UgJT4lCiAgaHRtbF9lbGVtZW50KCJ0YWJsZSIpICU+JQogIGh0bWxfdGFibGUoZmlsbCA9IFRSVUUpIAoKbWlyX3RhYmxlIDwtIG1pcl90YWJsZVstYygxOjMpLCBjKDEsMikgXSAKY29sbmFtZXMobWlyX3RhYmxlKSA8LSBjKCJNaXJHZW5lREJfSUQiLCAiTWlSQmFzZV9JRCIpCm1pcl90YWJsZSRNaXJHZW5lREJfSUQgPC0gc3ViKCIgViIsICIiLCBtaXJfdGFibGUkTWlyR2VuZURCX0lEKQoKaGVhZChtaXJfdGFibGUpCmBgYApgYGB7cn0KZG93bl9odW1vcmFsX2NsZWFuIDwtIHN1YigiXy4qIiwgIiIsIHJvdy5uYW1lcyhkb3duX2h1bW9yYWwpKQpkb3duX2h1bW9yYWxfY29udmVydGVkIDwtIG1pcl90YWJsZSRNaVJCYXNlX0lEW21hdGNoKGRvd25faHVtb3JhbF9jbGVhbiwgbWlyX3RhYmxlJE1pckdlbmVEQl9JRCldCmRvd25faHVtb3JhbF9jb252ZXJ0ZWQKYGBgCgoqKtCa0L7QvdCy0LXRgNGC0LDRhtC40Y8g0LIgTUlNQVRJRCoqIApOQSDQsdC10Lcg0YHQvtC+0YLQstC10YLRgdGC0LLQuNGPINGD0LTQsNC70LjQu9CwINC40Lcg0LDQvdCw0LvQuNC30LAKCk5BIEhzYS1NaXItMTQ4LVAyXzNwICDQtdGB0YLRjCDRgtGA0Lgg0L/QvtGF0L7QttC40YUg0YHQvtC+0YLQstC10YLRgdGC0LLQuNGPOgpIc2EtTWlyLTE0OC1QMQloc2EtbWlyLTE0OGEJCQkJCQkJCQkJCQkJCQkJCQkJCkhzYS1NaXItMTQ4LVAzCWhzYS1taXItMTUyCQkJCQkJCQkJCQkJCQkJCQkJCQkKSHNhLU1pci0xNDgtUDQJaHNhLW1pci0xNDhiCgpOQSBIc2EtTWlyLTEwLVAyYV81cCDQtdGB0YLRjCDRgtGA0Lgg0L/QvtGF0L7QttC40YUg0YHQvtC+0YLQstC10YLRgdGC0LLQuNC1OiAKSHNhLU1pci0xMC1QMmIJaHNhLW1pci05OWIJCQkJCQkJCQkJCQkJCQkKSHNhLU1pci0xMC1QMmMJaHNhLW1pci05OWEJCQkJCQkJCQkJCQkJCQkJCQkKSHNhLU1pci0xMC1QMmQJaHNhLW1pci0xMDAKClsxXSAiSHNhLU1pci0xNDYtUDFfNXAiICAgIkhzYS1NaXItNDI1XzNwKiIgICAgICJIc2EtTWlyLTE0OC1QMl8zcCIgICAiSHNhLU1pci0xMC1QM2NfNXAiICAgIkhzYS1NaXItMTAtUDJhXzVwIiAgCls2XSAiSHNhLU1pci0xOTMtUDFiXzVwKiIgIkhzYS1NaXItMTkzLVAxYl8zcCIgCgpgYGB7cn0KbWlybmFfbmFtZXNfZG93biA8LSBjKCJoc2EtbWlSLTE0NmItNXAiLCAiaHNhLW1pUi00MjUtM3AiLCAiaHNhLW1pUi0xMjViLTVwIiwgImhzYS1taVItMTkzYS01cCIsICJoc2EtbWlSLTE5M2EtM3AiKQpjb252ZXJ0ZWRfbWlybmFfZG93biA8LSBtaVJOQVZlcnNpb25Db252ZXJ0KG1pcm5hX25hbWVzX2Rvd24pCmNvbnZlcnRlZF9taXJuYV9kb3duCmBgYAoqKtCX0LDQv9GA0L7RgSDRgtCw0YDQs9C10YLQvtCyINC40Lcg0LHQsNC30YsgbXVsdGlNaVIqKiAKYGBge3J9CnRhcmdldHNfaHVtb3JhbF9kb3duIDwtIHVuaXF1ZShnZXRfbXVsdGltaXIob3JnID0gImhzYSIsIG1pcm5hID0gY29udmVydGVkX21pcm5hX2Rvd24kQWNjZXNzaW9uLCB0YWJsZSA9ICJ2YWxpZGF0ZWQiKUBkYXRhJHRhcmdldF9zeW1ib2wpCiN3cml0ZUxpbmVzKHRhcmdldHNfZG93biwgInRhcmdldHNfZG93bjE1MF9saXN0LnR4dCIpCmBgYAoqKtCQ0L3QsNC70LjQtyDQvtCx0L7Qs9Cw0YnQtdC90LjRjyDQuNC3INCx0LDQt9GLINCx0LjQvtC70L7Qs9C40YfQtdGB0LrQuNGFINC/0YDQvtGG0LXRgdGB0L7QsioqCmBgYHtyfQojbXNpZ19nb19icCA8LSBtc2lnZGJyKHNwZWNpZXMgPSAiSG9tbyBzYXBpZW5zIiwgY2F0ZWdvcnkgPSAiQzUiLCBzdWJjYXRlZ29yeSA9ICJHTzpCUCIpCiMgdGFyZ2V0c19kb3duIDwtIHJlYWRMaW5lcygidGFyZ2V0c19kb3duMTUwX2xpc3QudHh0IikKIyB0YXJnZXRzX3VwIDwtIHJlYWRMaW5lcygidGFyZ2V0c191cDE1MF9saXN0LnR4dCIpCgpHT19lbnJpY2hfZG93bl9odW1vcmFsX2JwIDwtIGVucmljaEdPKAogIGdlbmUgICAgICAgICAgPSB0YXJnZXRzX2h1bW9yYWxfZG93biwgIAogIE9yZ0RiICAgICAgICAgPSBvcmcuSHMuZWcuZGIsCiAga2V5VHlwZSAgICAgICA9ICJTWU1CT0wiLAogIG9udCAgICAgICAgICAgPSAiQlAiLCAKICBwQWRqdXN0TWV0aG9kID0gIkJIIiwKICBxdmFsdWVDdXRvZmYgID0gMC4wNQopCmBgYAoKKirQktC40LfRg9Cw0LvQuNC30LDRhtC40Y8qKgpgYGB7cn0KCnAxIDwtIGRvdHBsb3QoR09fZW5yaWNoX2Rvd25faHVtb3JhbF9icCwgc2hvd0NhdGVnb3J5ID0gMjApICsgCiAgZ2d0aXRsZSgiR08gRW5yaWNobWVudCBmb3IgRE9XTnJlZ3VsYXRlZCB0YXJnZXRzIikgKyAKICB0aGVtZSgKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyLCBmYWNlID0gImJvbGQiKSwKICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMSkKICApCgpwMQoKZ2dzYXZlKCIuL3BpY3R1cmVzX3RyYW5zcGwvdHJhbnNwbF9HT19lbnJpY2htZW50X2RvdHBsb3RfZG93bl9odW1vcmFsX2JwLnRpZmYiLCBwbG90ID0gcDEsIHdpZHRoID0gMTYsIGhlaWdodCA9IDEwLCBkcGkgPSAzMDApCmBgYApgYGB7cn0KR09fZW5yaWNoX0RPV05faHVtb3JhbF9CUCA8LSBlbnJpY2hwbG90OjpwYWlyd2lzZV90ZXJtc2ltKEdPX2VucmljaF9kb3duX2h1bW9yYWxfYnAsIG1ldGhvZCA9ICJKQyIpCgpwbHQgPC0gZW1hcHBsb3QoR09fZW5yaWNoX0RPV05faHVtb3JhbF9CUCwgCiAgICAgICAgIHJlcGVsID0gVFJVRSwKICAgICAgICAgc2hvd0NhdGVnb3J5ID0gMjApICsKICBnZ3RpdGxlKCJCaW9sb2dpY2FsIHByb2Nlc3NlcyBmb3IgRE9XTnJlZ3VsYXRlZCB0YXJnZXRzIGZvciBodW1vcmFsIikgKwogIHRoZW1lKAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIsIGZhY2UgPSAiYm9sZCIpLAogICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAzKQogICAgKSAgICAKCnBsdAoKZ2dzYXZlKCIuL3BpY3R1cmVzX3RyYW5zcGwvdHJhbnNwbF9HT19lbnJpY2htZW50X2VtYXBwbG90X0RPV05faHVtb3JhbF9CUC50aWZmIiwgcGxvdCA9IHBsdCwgd2lkdGggPSAxNiwgaGVpZ2h0ID0gMTAsIGRwaSA9IDMwMCkKYGBgCiMj0JrQu9C10YLQvtGH0L3QvtC1INC+0YLRgtC+0YDQttC10L3QuNC1CmBgYHtyfQpyZXNfY2VsbHVsYXIgPC0gcmVzdWx0cyhkZHMsIGNvbnRyYXN0PWMoImNvbmRpdGlvbiIsICJub19jb21wbGljYXRpb25zIiwgImNlbGx1bGFyIikpCnJlc19jZWxsdWxhcgpgYGAKKipNQSBwbG90KioKCmBgYHtyfQp0aWZmKCIuL3BpY3R1cmVzX3RyYW5zcGwvdHJhbnNwbF9QbG90TUFfc3RhbmRhcnRfcGFkal8wLjA1X2NlbGx1bGFyLnRpZmYiLCAKICAgICB3aWR0aCA9IDgsIGhlaWdodCA9IDYsIHVuaXRzID0gImluIiwgcmVzID0gMzAwLCBiZyA9ICJ3aGl0ZSIpCnBsb3RNQShyZXNfY2VsbHVsYXIsIGFscGhhID0gMC4wNSwgeWxpbSA9IGMoLTgsIDgpKSAKZGV2Lm9mZigpCnBsb3RNQShyZXNfY2VsbHVsYXIsIGFscGhhID0gMC4wNSwgeWxpbSA9IGMoLTgsIDgpKSAKYGBgCgoqKtCa0LDRgdGC0L7QvNC90YvQuSBNQSBwbG90KioKYGBge3J9CnJlc19kZiA8LSByZXNfY2VsbHVsYXIgJT4lCiAgYXMuZGF0YS5mcmFtZSgpICU+JQogIG11dGF0ZShjb2xvciA9IGNhc2Vfd2hlbiggCiAgICBwYWRqIDwgMC4wNSAgfiAicGFkaiA8IDAuMDUiLCAgIAogICAgcHZhbHVlIDwgMC4wNSAgfiAicHZhbHVlIDwgMC4wNSIsIAogICAgVFJVRSB+ICJBbGwiCiAgKSkKCnBsdCA8LSBnZ3Bsb3QocmVzX2RmLCBhZXMoeCA9IGJhc2VNZWFuLCB5ID0gbG9nMkZvbGRDaGFuZ2UsIGNvbG9yID0gY29sb3IpKSArCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuNywgc2l6ZSA9IDEpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBsaW5ldHlwZSA9ICJzb2xpZCIsIGNvbG9yID0gImdyYXk0MCIsIHNpemUgPSAxLjUpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiQWxsIiA9ICJncmF5NzAiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHZhbHVlIDwgMC4wNSIgPSAiYmx1ZSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYWRqIDwgMC4wNSIgPSAicmVkIikpICsKICBzY2FsZV94X2xvZzEwKGxhYmVscyA9IHNjYWxlczo6c2NpZW50aWZpYykgKyAKICB0aGVtZV9taW5pbWFsKCkgKwogIGxhYnMoeCA9ICJtZWFuIG9mIG5vcm1hbGl6ZWQgY291bnRzIiwgCiAgICAgICB5ID0gImxvZyBmb2xkIGNoYW5nZSIsIAogICAgICAgY29sb3IgPSBOVUxMKQoKcGx0Cmdnc2F2ZSgiLi9waWN0dXJlc190cmFuc3BsL3RyYW5zcGxf0KF1c3RvbSBNQXBsb3RfY2VsbHVsYXIudGlmZiIsIHBsb3QgPSBwbHQsIHdpZHRoID0gOCwgaGVpZ2h0ID0gNiwgZHBpID0gMzAwLCBiZyA9ICJ3aGl0ZSIpCmBgYAoqKtCR0JpB0J9DKioKYGBge3J9CnJlc19UQ0FEIDwtIHJlc3VsdHMoZGRzLCBjb250cmFzdD1jKCJjb25kaXRpb24iLCAibm9fY29tcGxpY2F0aW9ucyIsICJUQ0FEIikpCnJlc19UQ0FECmBgYAoKKipNQSBwbG90KioKYGBge3J9CnRpZmYoIi4vcGljdHVyZXNfdHJhbnNwbC90cmFuc3BsX1Bsb3RNQV9zdGFuZGFydF9wYWRqXzAuMDVfVENBRC50aWZmIiwgCiAgICAgd2lkdGggPSA4LCBoZWlnaHQgPSA2LCB1bml0cyA9ICJpbiIsIHJlcyA9IDMwMCwgYmcgPSAid2hpdGUiKQpwbG90TUEocmVzX1RDQUQsIGFscGhhID0gMC4wNSwgeWxpbSA9IGMoLTgsIDgpKSAKZGV2Lm9mZigpCnBsb3RNQShyZXNfVENBRCwgYWxwaGEgPSAwLjA1LCB5bGltID0gYygtOCwgOCkpIApgYGAKIyMg0JrQsNGB0YLQvtC80L3Ri9C5IE1BIHBsb3QKYGBge3J9CnJlc19kZiA8LSByZXNfVENBRCAlPiUKICBhcy5kYXRhLmZyYW1lKCkgJT4lCiAgbXV0YXRlKGNvbG9yID0gY2FzZV93aGVuKCAKICAgIHBhZGogPCAwLjA1ICB+ICJwYWRqIDwgMC4wNSIsICAgCiAgICBwdmFsdWUgPCAwLjA1ICB+ICJwdmFsdWUgPCAwLjA1IiwgCiAgICBUUlVFIH4gIkFsbCIKICApKQoKcGx0IDwtIGdncGxvdChyZXNfZGYsIGFlcyh4ID0gYmFzZU1lYW4sIHkgPSBsb2cyRm9sZENoYW5nZSwgY29sb3IgPSBjb2xvcikpICsKICBnZW9tX3BvaW50KGFscGhhID0gMC43LCBzaXplID0gMSkgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGxpbmV0eXBlID0gInNvbGlkIiwgY29sb3IgPSAiZ3JheTQwIiwgc2l6ZSA9IDEuNSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCJBbGwiID0gImdyYXk3MCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwdmFsdWUgPCAwLjA1IiA9ICJibHVlIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhZGogPCAwLjA1IiA9ICJyZWQiKSkgKwogIHNjYWxlX3hfbG9nMTAobGFiZWxzID0gc2NhbGVzOjpzY2llbnRpZmljKSArIAogIHRoZW1lX21pbmltYWwoKSArCiAgbGFicyh4ID0gIm1lYW4gb2Ygbm9ybWFsaXplZCBjb3VudHMiLCAKICAgICAgIHkgPSAibG9nIGZvbGQgY2hhbmdlIiwgCiAgICAgICBjb2xvciA9IE5VTEwpCgpwbHQKZ2dzYXZlKCIuL3BpY3R1cmVzX3RyYW5zcGwvdHJhbnNwbF/QoXVzdG9tX01BcGxvdF9UQ0FELnRpZmYiLCBwbG90ID0gcGx0LCB3aWR0aCA9IDgsIGhlaWdodCA9IDYsIGRwaSA9IDMwMCwgYmcgPSAid2hpdGUiKQpgYGAKKirQl9C90LDRh9C40LzRi9C1INGA0LXQt9GD0LvRjNGC0LDRgtGLKioKYGBge3J9CnNpZ25yZXNfVENBRCA8LSByZXN1bHRzKGRkcywgY29udHJhc3Q9YygiY29uZGl0aW9uIiwgIm5vX2NvbXBsaWNhdGlvbnMiLCAiVENBRCIpLCBhbHBoYT0wLjA1KSAKc3VtbWFyeShzaWducmVzX1RDQUQpCmBgYAoqKlZvbGNhbm8gcGxvdCoqCmBgYHtyfQpwbHQgPC0gRW5oYW5jZWRWb2xjYW5vKHJlc19UQ0FELAogICAgICAgICAgICAgICAgbGFiID0gcm93bmFtZXMocmVzX1RDQUQpLAogICAgICAgICAgICAgICAgeCA9ICJsb2cyRm9sZENoYW5nZSIsCiAgICAgICAgICAgICAgICB5ID0gInBhZGoiLAogICAgICAgICAgICAgICAgcEN1dG9mZiA9IDAuMDUsCiAgICAgICAgICAgICAgICBGQ2N1dG9mZiA9IDEsCiAgICAgICAgICAgICAgICBsYWJTaXplID0gMy4wLAogICAgICAgICAgICAgICAgYm94ZWRMYWJlbHMgPSBGQUxTRSwKICAgICAgICAgICAgICAgIGNvbCA9IGMoJ2JsYWNrJywgJyNDQkQ1RTgnLCAnI0IzRTJDRCcsICcjRkRDREFDJyksCiAgICAgICAgICAgICAgICBjb2xBbHBoYSA9IDEsCiAgICAgICAgICAgICAgICB0aXRsZSA9IE5VTEwsICAgICAgICAKICAgICAgICAgICAgICAgIHN1YnRpdGxlID0gTlVMTCkgCgpwbHQKZ2dzYXZlKCIuL3BpY3R1cmVzX3RyYW5zcGwvdHJhbnNwbF9Wb2xjYW5vUGxvdF9UQ0FELnRpZmYiLCBwbG90ID0gcGx0LCB3aWR0aCA9IDgsIGhlaWdodCA9IDYsIGRwaSA9IDMwMCwgYmcgPSAid2hpdGUiKQpgYGAKKirQkNC90LDQu9C40Lcg0L7QsdC+0LPQsNGJ0LXQvdC40Y8gVENBRCoqCmBgYHtyfQpyZXNfc2lnbl9UQ0FEIDwtIHN1YnNldChyZXNfVENBRCwgcGFkaiA8IDAuMDUgJiAhaXMubmEocGFkaikgJiBhYnMobG9nMkZvbGRDaGFuZ2UpID4gMS4wKQoKdXBfVENBRCA8LSByZXNfc2lnbl9UQ0FEICU+JSAKICBhcy5kYXRhLmZyYW1lKCkgJT4lIAogIGZpbHRlcihsb2cyRm9sZENoYW5nZSA+IDApCgpyb3duYW1lcyh1cF9UQ0FEKQpgYGAKCmBgYHtyfQptaXJuYV9uYW1lc191cCA8LSAiaHNhLW1pUi01ODItM3AiCmNvbnZlcnRlZF9taXJuYV91cCA8LSBtaVJOQVZlcnNpb25Db252ZXJ0KG1pcm5hX25hbWVzX3VwKQpjb252ZXJ0ZWRfbWlybmFfdXAKYGBgCioq0JfQsNC/0YDQvtGBINGC0LDRgNCz0LXRgtC+0LIg0LjQtyDQsdCw0LfRiyBtdWx0aU1pKioKYGBge3J9CnRhcmdldHNfVENBRF91cCA8LSB1bmlxdWUoZ2V0X211bHRpbWlyKG9yZyA9ICJoc2EiLCBtaXJuYSA9IGNvbnZlcnRlZF9taXJuYV9kb3duJEFjY2Vzc2lvbiwgdGFibGUgPSAidmFsaWRhdGVkIilAZGF0YSR0YXJnZXRfc3ltYm9sKQp0YXJnZXRzX1RDQURfdXAKYGBgCioq0JDQvdCw0LvQuNC3INC+0LHQvtCz0LDRidC10L3QuNGPINC40Lcg0LHQsNC30Ysg0LHQuNC+0LvQvtCz0LjRh9C10YHQutC40YUg0L/RgNC+0YbQtdGB0YHQvtCyKioKYGBge3J9CkdPX2VucmljaF91cF9UQ0FEX2JwIDwtIGVucmljaEdPKAogIGdlbmUgICAgICAgICAgPSB0YXJnZXRzX1RDQURfdXAsICAKICBPcmdEYiAgICAgICAgID0gb3JnLkhzLmVnLmRiLAogIGtleVR5cGUgICAgICAgPSAiU1lNQk9MIiwKICBvbnQgICAgICAgICAgID0gIkJQIiwgCiAgcEFkanVzdE1ldGhvZCA9ICJCSCIsCiAgcXZhbHVlQ3V0b2ZmICA9IDAuMDUKKQpgYGAKKirQktC40LfRg9Cw0LvQuNC30LDRhtC40Y8qKgpgYGB7cn0KcDEgPC0gZG90cGxvdChHT19lbnJpY2hfdXBfVENBRF9icCwgc2hvd0NhdGVnb3J5ID0gMjApICsgCiAgZ2d0aXRsZSgiR08gRW5yaWNobWVudCBmb3IgVVByZWd1bGF0ZWQgdGFyZ2V0cyBUQ0FEIikgKyAKICB0aGVtZSgKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyLCBmYWNlID0gImJvbGQiKSwKICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMSkKICApCgpwMQoKZ2dzYXZlKCIuL3BpY3R1cmVzX3RyYW5zcGwvdHJhbnNwbF9HT19lbnJpY2htZW50X2RvdHBsb3RfdXBfVENBRF9icC50aWZmIiwgcGxvdCA9IHAxLCB3aWR0aCA9IDE2LCBoZWlnaHQgPSAxMCwgZHBpID0gMzAwKQpgYGAKCmBgYHtyfQpHT19lbnJpY2hfVVBfVENBRF9icCA8LSBlbnJpY2hwbG90OjpwYWlyd2lzZV90ZXJtc2ltKEdPX2VucmljaF91cF9UQ0FEX2JwLCBtZXRob2QgPSAiSkMiKQoKcGx0IDwtIGVtYXBwbG90KEdPX2VucmljaF9VUF9UQ0FEX2JwLCAKICAgICAgICAgcmVwZWwgPSBUUlVFLAogICAgICAgICBzaG93Q2F0ZWdvcnkgPSAyMCkgKwogIGdndGl0bGUoIkJpb2xvZ2ljYWwgcHJvY2Vzc2VzIGZvciBVUHJlZ3VsYXRlZCB0YXJnZXRzIGZvciBUQ0FEIikgKwogIHRoZW1lKAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIsIGZhY2UgPSAiYm9sZCIpLAogICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAzKQogICAgKSAgICAKCnBsdAoKZ2dzYXZlKCIuL3BpY3R1cmVzX3RyYW5zcGwvdHJhbnNwbF9HT19lbnJpY2htZW50X2VtYXBwbG90X3VwX1RDQURfQlAudGlmZiIsIHBsb3QgPSBwbHQsIHdpZHRoID0gMTYsIGhlaWdodCA9IDEwLCBkcGkgPSAzMDApCmBgYAo=